如何使用msbuild执行文件系统发布配置文件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (42)

我有用VS2010创建的ac#.Net 4.0项目,现在正在使用VS2012进行访问。

我试图从本网站只发布需要的文件到目标位置(C:\ builds \ MyProject [Files])

我的文件结构: ./ProjectRoot / MyProject.csproj ./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml

我通过MSBuild运行以下内容:

C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ MSBuild.exe ./ProjectRoot/MyProject.csproj / p:DeployOnBuild = true /p:PublishProfile=./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml

这是FileSystemDebug.pubxml中的xml:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>C:\builds\MyProject\</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

由此产生的行为是:

  • 这里创建一个zip文件:./ProjectRoot/obj/Debug/Package/MyProject.zip
  • 什么都没有部署到<publishUrl>C:\builds\MyProject\</publishUrl>WTF
  • 创建的zip文件是猪早餐,并且包含了应用程序不需要的文件。

当我通过Visual Studio运行这个发布配置文件时,会在* C:\ builds \ MyProject *中创建一个文件夹,并且包含我想要的确切工件。

如何使用msbuild执行文件系统发布配置文件?

提问于
用户回答回答于

我对Visual Studio 2015有同样的问题。经过数小时的尝试,我现在可以做到msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofile

包含这样一行:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" 
  Condition="false" />

我改变了这一行,如下所示:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0\WebApplications\Microsoft.WebApplication.targets" />
用户回答回答于

参考:

http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild

Visual Studio 2010具有出色的新Web应用程序项目发布功能,使你可以通过单击按钮轻松发布你的Web应用程序项目。Web.config转换和软件包构建由导入到项目文件中的大量MSBuild脚本完成(位于:C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft .Web.Publishing.targets)。该文件的大流程图以及一些关于如何挂钩的文档将会很好,但似乎很遗憾(或者至少我找不到它)。 但是,这意味着通过命令行执行发布比需要的更加不透明。我对这方面缺乏文档感到惊讶,因为现在很多商店使用持续集成服务器,有些甚至做自动部署(VS2010发布功能可以帮助很多),所以我会认为启用这个功能(很容易!)将是该功能的一个相当主要的要求。 VS2010发布到文件系统对话框发布到文件系统花了我一段时间,因为我期望一些合理的使用MSBuild发生。相反,VS2010的确有些奇怪:它调用MSBuild执行一种半部署,在项目的obj文件夹中准备Web应用程序的文件,然后它似乎做了这些文件的手动拷贝(即,在MSBuild之外)到你的目标发布文件夹。这实际上是因为MSBuild被设计为复制周围的文件(和其他与构建相关的东西),因此如果整个过程只是VS2010调用的一个MSBuild目标,而不是目标,然后是手动副本,那么这将是有意义的。 这意味着通过命令行通过MSBuild执行此操作并不像调用具有特定目标的项目文件和设置某些属性那么简单。你需要做VS2010应该做的事情:自己创建一个执行半部署的目标,然后将结果复制到目标文件夹。要编辑你的项目文件,请右键单击VS2010中的项目,然后单击卸载项目,然后再次右键单击并单击编辑。向下滚动,直到找到导入Web应用程序目标的Import元素(Microsoft.WebApplication.targets;此文件本身导入前面提到的Microsoft.Web.Publishing.targets文件)。在这一行下面,我们将添加我们的新目标,称为PublishToFileSystem:

<Target Name="PublishToFileSystem"
        DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
    <Error Condition="'$(PublishDestination)'==''"
           Text="The PublishDestination property must be set to the intended publishing destination." />
    <MakeDir Condition="!Exists($(PublishDestination))"
             Directories="$(PublishDestination)" />

    <ItemGroup>
        <PublishFiles Include="$(_PackageTempDir)\**\*.*" />
    </ItemGroup>

    <Copy SourceFiles="@(PublishFiles)"
          DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
          SkipUnchangedFiles="True" />
</Target>

此目标取决于PipelinePreDeployCopyAllFilesToOneFolder目标,这是VS2010在执行手动复制之前调用的目标。在Microsoft.Web.Publishing.targets中进行的一些挖掘显示,调用此目标会导致项目文件被放置到属性_PackageTempDir指定的目录中。 我们在目标中调用的第一个任务是错误任务,我们在其中放置了一个条件,以确保只有在未设置PublishDestination属性时才会执行任务。如果你忘记指定PublishDestination属性,这会捕获你并错误构建。然后我们调用MakeDir任务来创建该PublishDestination目录(如果它尚不存在)。 然后我们定义一个名为PublishFiles的项目,它代表在_PackageTempDir文件夹下找到的所有文件。然后调用复制任务,将所有这些文件复制到发布目标文件夹。Copy元素上的DestinationFiles属性有点复杂。它执行项目的转换并将它们的路径转换为以PublishDestination文件夹为根的新路径(检查知名项目元数据以查看这些%()的含义)。 为了从命令行调用这个目标,我们现在可以简单地执行这个命令(显然改变项目文件名和属性以适合你):

msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem

所属标签

可能回答问题的人

  • 嗨喽你好

    7 粉丝480 提问9 回答
  • uncle_light

    5 粉丝518 提问8 回答
  • 富有想象力的人

    3 粉丝0 提问7 回答
  • 无聊至极

    4 粉丝504 提问6 回答

扫码关注云+社区

领取腾讯云代金券