使用msbuild执行文件系统发布配置文件
本文关键字:配置文件 文件系统 msbuild 执行 使用 | 更新日期: 2023-09-27 18:11:09
我有一个用VS2010创建的c# . net 4.0项目,现在用VS2012访问。
我正在尝试只从这个网站发布所需的文件到目标位置(C:'builds'MyProject[files])
文件结构:/ProjectRoot/MyProject.csproj。/ProjectRoot/属性/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
了。
我不得不编辑我的。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,不确定这是否必要。但是我必须删除条件部分
在这里找到答案:http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
Visual Studio 2010有很棒的新Web应用程序项目发布允许您轻松发布web应用程序项目的功能点击按钮。在幕后是网络。配置转换和包构建是由导入的大量MSBuild脚本完成的到您的项目文件(可在:C:'Program Files找到)微软(x86) ' [' ' VisualStudio ' v10.0 ' Web ' Microsoft.Web.Publishing.targets)。不幸的是,剧本非常复杂,混乱而且没有文档记录(除了一些经常拼写错误和大部分无用的)文件中的注释)。那份文件的大流程图和一些关于如何钩入它的文档会很好,但似乎是可惜缺少(或者至少我找不到)。
不幸的是,这意味着通过命令行执行发布比它需要的更不透明。我对这种缺乏感到惊讶这方面的文档,因为这些天许多商店使用持续集成服务器,有的甚至做自动化部署(VS2010的发布功能可以提供很多帮助),所以我我是否曾想过,实现这一点(很容易!)会是一件好事
无论如何,在挖掘了microsoft.web.publish.targets我一写就是好几个小时,脑袋不停地碰壁,我已经设法弄清楚Visual Studio似乎是如何执行其功能的魔法一键"发布到文件系统"answers"构建部署"包"的特性。我将进入一些MSBuild脚本,所以如果你不熟悉MSBuild,我建议你看看这个崩溃课程MSDN页面。
发布到文件系统
VS2010"发布到文件系统"对话框打开我花了一段时间才弄清楚,因为我期望一些明智的使用MSBuild正在发生。相反,VS2010做了一些非常奇怪的事情:它调用在MSBuild上执行一种准备web的半部署App的文件在你的项目的obj文件夹,然后它似乎做一个手册这些文件的副本(例如:在MSBuild之外)到你的目标发布文件夹中。这是一种非常糟糕的行为,因为MSBuild的设计就是这样的复制文件(以及其他与构建相关的东西),这样才有意义如果整个过程只是VS2010调用的一个MSBuild目标On,不是目标,则手动复制。
这意味着通过命令行上的MSBuild执行此操作不是as就像使用特定目标和调用项目文件一样简单设置一些属性。你需要做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在进行手动拷贝之前调用。一些人在挖掘目标显示调用这个目标会导致属性指定的目录中放置的项目文件房地产_PackageTempDir。
我们在目标中调用的第一个任务是Error任务,在这个任务上我们设置了一个条件,确保任务只在PublishDestination属性尚未设置。这个会抓住你的并且在您忘记指定的情况下错误地退出构建PublishDestination财产。然后调用MakeDir任务进行创建
如果PublishDestination目录不存在。然后定义一个名为PublishFiles的Item,它表示所有的_PackageTempDir文件夹下的文件。拷贝任务结束调用,它将所有这些文件复制到Publish Destination文件夹。Copy元素上的DestinationFiles属性有点复杂;它执行项的转换,并将它们的路径转换为new根植于PublishDestination文件夹的路径(查看known条目元数据以查看那些%()s的含义)。
要从命令行调用这个目标,我们现在可以简单地执行此命令(显然更改了项目文件名和属性)适合你):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:'Temp'Publish" /t:PublishToFileSystem
在尝试了以上所有答案后仍然有问题(我使用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版本的参数。
在我看来,您的发布配置文件没有被使用,并且正在进行一些默认打包。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
注意,这是使用VisualStudio 2012版本的Microsoft Web Publish目标完成的,通常位于"C:'Program Files (x86)'MSBuild'Microsoft'VisualStudio'v11.0'Web"。查看所使用的特定部署类型目标的部署文件夹
实际上,我将您的所有答案合并到我自己的解决方案中,如何解决上述问题:
- 我根据我的需要创建pubxml文件
- 然后我将所有参数从pubxml文件复制到我自己的参数列表"/p:foo=bar"for msbuild.exe
- 我扔掉了pubxml文件
结果如下:
msbuild /t:restore /t:build /p:WebPublishMethod=FileSystem /p:publishUrl=C:'builds'MyProject' /p:DeleteExistingFiles=True /p:LastUsedPlatform="Any CPU" /p:Configuration=Release
仅供参考:在构建服务器上运行同样的问题(安装了msbuild 15的Jenkins,在. 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开关,它就正确地选择了配置文件。
从项目文件夹运行
msbuild/p:DeployOnBuild=true/p:PublishProfile="release-file.pubxml"/p:AspnetMergePath="C:'Program Files (x86)'Microsoft sdk 'Windows'v10.0A'bin'NETFX 4.8 Tools"发布/p:配置=
这个照顾web。配置Transform和AspnetMergePath
首先检查开发者PC的Visual studio版本,它可以发布解决方案(项目)。如图所示为VS 2013
/p:VisualStudioVersion=12.0
添加上面的命令行来指定应该用什么样的visual studio版本来构建项目。正如前面的答案,当我们试图只发布一个项目,而不是整个解决方案时,可能会发生这种情况。
所以完整的代码应该是这样的"C:'Windows' microt.net 'Framework'v4.0.30319'msbuild.exe" "C:'Program Files (x86)'Jenkins'workspace'Jenkinssecondsample'MVCSampleJenkins'MVCSampleJenkins。csproj"/T:Build;Package/p:Configuration=DEBUG/p:OutputPath="obj'DEBUG"/p:DeployIisAppPath="Default Web Site/jenkinsdemoapp"/p:VisualStudioVersion=12.0