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

时间:2013-04-26 23:19:20

标签: c# visual-studio msbuild publish

我有一个用VS2010创建的c#.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获得这个简单的结果?

8 个答案:

答案 0 :(得分:41)

仅供参考:我在Visual Studio 2015中遇到了同样的问题。经过几个小时的尝试,我现在可以InputStream propFileInpStream = LocateFile.class.getResourceAsStream("../../../"+PROP_FILE);

我必须编辑我的.csproj文件才能使其正常工作。它包含这样的一行:

msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofile

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

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

(我将10.0更改为14.0,不确定是否有必要。但我必须删除条件部分。)

答案 1 :(得分:39)

在这里找到答案: http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild

  

Visual Studio 2010具有出色的新Web应用程序项目发布功能   允许您使用a轻松发布Web应用程序项目的功能   点击一个按钮。在幕后进行Web.config转换和   包构建是由导入的大量MSBuild脚本完成的   进入你的项目文件(在:C:\ Program Files找到)   (86)\的MSBuild \微软\ VisualStudio的\ V10.0 \网络\ Microsoft.Web.Publishing.targets)。   不幸的是,脚本非常复杂,杂乱无章   没有记录(除了一些非常严重的拼写,大多无用   文件中的评论)。该文件的一个大流程图和一些   关于如何挂钩它的文档会很好,但似乎是   可悲的是缺乏(或至少我找不到)。

     

不幸的是,这意味着通过命令行执行发布   比它需要的更不透明。我对此缺乏感到惊讶   在这方面的文件,因为这些天很多商店使用   持续集成服务器,有些甚至做自动部署   (VS2010的发布功能可以帮助很多),所以我   会想到启用这个(很容易!)会是一个   该功能的主要要求。

     

无论如何,在挖掘了Microsoft.Web.Publishing.targets之后   提出几个小时的文件,撞到了试验和错误墙,   我已经设法弄清楚Visual Studio如何执行它   魔术一击“发布到文件系统”和“构建部署   套餐“功能。我将进入一些MSBuild脚本,所以   如果您不熟悉MSBuild,我建议您查看此崩溃   课程MSDN页面。

     

发布到文件系统

     

VS2010发布到文件系统对话框发布到文件系统   我有一段时间坚持,因为我期待一些合理使用MSBuild   要发生。相反,VS2010做了一件非常奇怪的事情:它调用了   在MSBuild上执行一种准备Web的半部署   应用程序的文件在项目的obj文件夹中,然后它似乎做了一本手册   这些文件的副本(即在MSBuild之外)复制到目标发布中   夹。这确实是一种严重的行为,因为MSBuild旨在实现   复制文件(和其他与构建相关的东西),所以它是有道理的   如果整个过程只是VS2010调用的一个MSBuild目标   on,而不是目标,然后是手动副本。

     

这意味着在命令行上通过MSBuild执行此操作并非如此   简单地用特定目标调用项目文件   设置一些属性。你需要做VS2010应该做的事情   完成:自己创建一个目标,然后执行半部署   将结果复制到目标文件夹。要编辑项目文件,   右键单击VS2010中的项目,然后单击“卸载项目”   再次右键单击并单击“编辑”。向下滚动,直到找到   导入Web应用程序目标的导入元素   (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显示调用此目标会导致   将项目文件放入由指定的目录中   property _PackageTempDir。

     

我们在目标中调用的第一个任务是Error任务,在此任务   我们已经设置了一个条件,确保只有在任务发生时才会执行任务   尚未设置PublishDestination属性。这会抓住你   并且如果您忘记指定,则会出错   PublishDestination属性。然后我们调用MakeDir任务来创建   如果PublishDestination目录尚不存在,则为该目录。

     

然后,我们定义一个名为PublishFiles的项,代表所有   在_PackageTempDir文件夹下找到的文件。然后是复制任务   调用将所有这些文件复制到“发布目标”文件夹。   Copy元素上的DestinationFiles属性有点复杂;   它执行项目的转换并将其路径转换为新的   以PublishDestination文件夹为根的路径(请参阅Well-Known   项目元数据,以查看那些%()的含义。

     

要从命令行调用此目标,我们现在可以简单地执行   这个命令(显然改变了项目文件名和属性   适合你):

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

答案 2 :(得分:18)

在尝试上述所有答案后仍然遇到麻烦(我使用Visual Studio 2013)。没有任何内容被复制到发布文件夹。

问题是,如果我使用单个项目而不是解决方案运行MSBuild,我必须添加一个指定Visual Studio版本的附加参数:

/p:VisualStudioVersion=12.0

12.0适用于VS2013,替换为您使用的版本。一旦我添加了这个参数,它就可以了。

完整的命令行如下所示:

MSBuild C:\PathToMyProject\MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=MyPublishProfile /p:VisualStudioVersion=12.0

我在这里找到了它:

http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/command-line-deployment

他们说:

  

如果指定单个项目而不是解决方案,则必须添加指定Visual Studio版本的参数。

答案 3 :(得分:12)

在我看来,您的发布配置文件未被使用,并且正在进行一些默认打包。 Microsoft Web Publish目标执行您正在执行的所有操作,它根据配置选择正确的目标。

我从TeamCity MSBuild步骤开始没有问题,但我确实指定了配置文件的显式路径,你只需要通过名称调用它而没有.pubxml(例如FileSystemDebug)。只要在你自己的标准文件夹中就可以找到它。

示例:

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

请注意,这是使用Microsoft Web Publish目标的Visual Studio 2012版本完成的,通常位于&#34; C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web&#34; 。查看部署文件夹,了解所使用的特定部署类型目标

答案 4 :(得分:3)

仅供参考:在构建服务器上运行时会遇到同样的问题(安装了msbuild 15的詹金斯,是从.NET Core 2.1 Web项目上的VS 2017驱动的。)

在我的案例中,正是使用msbuild的“发布”目标忽略了配置文件。

所以我的msbuild命令开始于:

msbuild /t:restore;build;publish

这可以正确触发发布过程,但是“ / p:PublishProfile = FolderProfile”的组合或变体都无法用来选择我要使用的配置文件(“ FolderProfile”)。

当我停止使用发布目标时:

msbuild /t:restore;build /p:DeployOnBuild=true /p:PublishProfile=FolderProfile

我(愚蠢地)以为这没什么用,但是一旦我使用DeployOnBuild开关,它就正确地获取了配置文件。

答案 5 :(得分:1)

首先检查可以发布解决方案(项目)的开发人员PC的Visual Studio版本。 如图所示是VS 2013

 /p:VisualStudioVersion=12.0

添加上面的命令行以指定应该构建项目的Visual Studio版本的类型。如前所述,当我们尝试仅发布一个项目而不是整个解决方案时,可能会发生这种情况。

答案 6 :(得分:1)

实际上,我将所有答案合并到自己的解决方案中,以解决上述问题:

  1. 我根据需要创建pubxml文件
  2. 然后我将pubxml文件中的所有参数复制到msbuild.exe的参数列表“ / p:foo = bar”中
  3. 我扔掉了pubxml文件

结果是这样的:

msbuild /t:restore /t:build /p:WebPublishMethod=FileSystem /p:publishUrl=C:\builds\MyProject\ /p:DeleteExistingFiles=True /p:LastUsedPlatform="Any CPU" /p:Configuration=Release

答案 7 :(得分:0)

从项目文件夹运行

msbuild /p:DeployOnBuild=true /p:PublishProfile="release-file.pubxml" /p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin \NETFX 4.8 工具" /p:Configuration=Release

这负责 web.config Transform 和 AspnetMergePath