使用msbuild执行文件系统发布configuration文件

我有使用VS2010创build的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> 

由此产生的行为是:

  • 在这里创build一个zip文件: ./ProjectRoot/obj/Debug/Package/MyProject.zip
  • 没有部署到<publishUrl>C:\builds\MyProject\</publishUrl> WTF
  • 创build的zip文件是猪早餐和充满应用程序不需要的文件。

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

我如何从msbuild得到这个简单的结果?

FYI:我有与Visual Studio 2015相同的问题。经过几个小时的尝试,现在我可以做msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofile

我不得不编辑我的.csproj文件才能正常工作。 它包含这样一行:

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

我改变了这一行如下:

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

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

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

Visual Studio 2010具有出色的新Web应用程序项目发布function,使您可以通过点击一个button轻松发布您的Web应用程序项目。 在幕后,Web.config转换和包构build是通过导入到项目文件中的大量MSBuild脚本完成的(位于:C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft .Web.Publishing.targets)。 不幸的是,这个脚本非常复杂,杂乱无章(其他的文件中还有一些非常糟糕的拼写和无用的注释)。 该文件和一些关于如何挂钩的文档的大stream程图将是很好的,但似乎是可悲的缺乏(或者至less我找不到)。

不幸的是,这意味着通过命令行进行发布比需要的更加不透明。 我对这方面缺乏文档感到惊讶,因为现在很多商店使用持续集成服务器,有些甚至做自动部署(VS2010发布function可以帮助很多),所以我会认为,这(很容易!)将是一个相当主要的function要求。

无论如何,在深入挖掘Microsoft.Web.Publishing.targets文件几个小时,然后把我的头撞向试验和错误墙,我已经设法弄清楚Visual Studio如何执行它的魔法,单击“发布到文件系统”和“构build部署包”function。 我将进入一些MSBuild脚本,所以如果你不熟悉MSBuild,我build议你看看这个MSDN页面的速成课程。

发布到文件系统

VS2010发布到文件系统对话框发布到文件系统花了我一段时间,因为我期望一些合理的使用MSBuild发生。 相反,VS2010做了一件非常奇怪的事情:它调用MSBuild执行一种半部署,在项目的obj文件夹中准备Web应用程序的文件,然后看起来是手动拷贝这些文件(即在MSBuild之外)到您的目标发布文件夹。 这是非常重要的行为,因为MSBuild被devise为复制文件(和其他构build相关的东西),所以如果整个过程只是VS2010调用的一个MSBuild目标,而不是目标,那么手动复制就是有意义的。

这意味着通过命令行通过MSBuild执行此操作并不像调用具有特定目标的项目文件和设置一些属性那么简单。 您需要做VS2010应该做的事情:自己创build一个执行半部署的目标,然后将结果复制到目标文件夹。 要编辑您的项目文件,请右键单击VS2010中的项目,然后单击“卸载项目”,然后再次右键单击并单击“编辑”。 向下滚动,直到find导入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任务来创buildPublishDestination目录(如果尚不存在的话)。

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

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

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

它看起来像你的发布configuration文件没有被使用,并做一些默认的包装。 Microsoft Web Publish目标完成上面所做的全部工作,它会根据configurationselect正确的目标。

我从TeamCity MSBuild步骤中得到了工作没有问题,但我确实指定了一个明确的path到configuration文件,你只需要通过名称调用它没有.pubxml(例如FileSystemDebug)。 只要在你的标准文件夹中就可以find它。

例:

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

请注意,这是通过位于“C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web”的Visual Web 2012版本的Microsoft Web Publish目标完成的。 查看所使用的特定部署types目标的部署文件夹

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

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

 /p:VisualStudioVersion=12.0 

VS2013是12.0 ,replace为你使用的版本。 一旦我添加了这个参数,它只是工作。

完整的命令行如下所示:

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

我在这里find了它:

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

他们指出:

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

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

  /p:VisualStudioVersion=12.0 

添加上面的命令行来指定什么样的Visual Studio版本应该build立项目。 如前所述,当我们试图发布一个项目而不是整个解决scheme时,可能会发生这种情况。