如何通过命令行向MSBuild传递MSDeploy风格的参数?

4

我正在配置 TeamCity 来部署我们的网站项目应用程序(使用 *.wdproj 文件)和 Web Deploy 应用程序到 IIS。

我有一个构建配置,使用 MSBuild.exe 和 MSDeployPublish 来构建并部署应用程序。

现在,我们希望将应用程序部署到多个目标环境中,因此需要一种根据目标环境提供不同设置的方法。

我已经向 Web 部署项目添加了 parameters.xml 文件,并验证了这里设置的参数已经通过目标 IIS 服务器并正确应用 - 太棒了!

现在我想要做的是针对每个环境设置不同的参数。我希望我可以使用类似 MSDeploy.exe -setParam 参数来指定每个环境的不同值,但是我找不到任何通过命令行将我的参数值传递给 MSBuild 的方法。

我怀疑我可能需要执行以下操作之一:

  1. 将 MSBuild 和 MSDeploy 拆分为单独的构建步骤。

  2. 在管道中的某个位置配置一个任务,以获取 parameters.something.xml 的 1 个版本,并将其移动到 parameters.xml 中,以便被管道的其余部分捕获。

我正在寻找最简单的方法来继续,欢迎任何建议。

供参考,这是我当前正在尝试的命令:

msbuild /target:MSDeployPublish MySite_deploy.wdproj /P:Configuration=Debug
/P:DeployOnBuild=True /P:DeployTarget=MSDeployPublish
/P:MsDeployServiceUrl=www.myserver.com:8172/MsDeploy.axd
/P:AllowUntrustedCertificate=True /P:MSDeployPublishMethod=WMSvc
/P:CreatePackageOnPublish=True /P:UserName=MyUser /p:Password=MyPassword
/P:DeployIisAppPath=www.myserver.com/MySite
/P:ServerURL=http://www.tryingtoforcethis.com

除了ServerURL的值,其他的都非常完美。 ServerURL是我在parameters.xml中定义的参数,但它没有传递到目标站点中。 不过,我在parameters.xml中指定的默认值确实起作用了。 所以我知道参数生效了,只是我无法弄清楚如何将它们添加到msbuild命令行中。

3个回答

3
我认为简短的答案是,使用MSBuild 4.0和VS2010时,你不能仅仅通过调用MSBuild来将任意参数传递到MSDeployPublish中。
我发现以下帖子有帮助: http://forums.iis.net/t/1167657.aspx/1 - Ming Chen的评论 http://www.hanselman.com/blog/TinyHappyFeatures3PublishingImprovementsChainedConfigTransformsAndDeployingASPNETAppsFromTheCommandLine.aspx - Richard Szalay在底部的评论
阅读了这些内容,并在Microsoft.Web.Publishing.targets文件中找寻了一段时间以找到“入口”,最终我选择在源代码控制中的项目文件夹中拥有多个Parameters.xml的副本,根据其环境进行标记。
  • Parameters.Test.xml
  • Parameters.Staging.xml
  • Parameters.Live.xml

在打包和部署之前,我只需将其中一个文件复制到Parameters.xml中,然后其余的流程就会自动完成 - 完成!

顺便说一下,我曾经遇到过一个临时问题,无法在单个MSBuild.exe调用中使parameters.xml复制和后续清理正常工作,这似乎是某种文件访问问题,我在这里详细说明了它:

MSBuild.exe Copy task not working properly unless a version of the file already appears in target


我之前做过类似的事情。我使用了msbuild命令,并对每个配置进行了配置转换和发布设置。但是,我们有8个qa站点,我不想要8个qa配置转换,所以在msbuild任务之后,我复制了适当的params.xml文件(我为每个qa站点都有一个teamcity构建配置),然后进行了msdeploy,这就是您可以添加跳过等命令的地方。听起来你现在已经准备好了,还是有任何障碍吗? - Dan Csharpster
我准备好了!虽然不是最优雅的,但现在它能用。呼。我要关闭项目的这一部分了。 :-) - Michael12345

2
回答你的问题,命令行参数化不是MSBuild的关注重点。相反,你应该使用外部工具。例如,如果你从批处理文件运行msbuild命令,你可以将参数传递给批处理文件,并为每个环境使用不同的参数运行它。另一种方法是使用构建系统,如TeamCity 或VSTS,并利用它们的参数化机制。针对VSTS或TFS,你的命令可能如下所示:
msbuild MySite_deploy.wdproj /target:MSDeployPublish /p:Configuration=Debug
/p:DeployOnBuild=True /p:MsDeployServiceUrl=$(IIsHostNameIp)
/p:AllowUntrustedCertificate=True /p:MSDeployPublishMethod=WMSvc
/p:CreatePackageOnPublish=True /p:UserName=$(IIsUserName) /p:Password=$(IIsPassword)
/p:DeployIisAppPath=$(IIsSite)

此外,我建议对您的原始命令行进行一些清理:
  1. 使用/p:target和/p:DeployTarget是多余的。任何一个都足够了。它也可以用/p:WebPublishMethod替换。
  2. 对于/p:MSDeployServiceUrl,只提供DNS名称或IP就足够了。端口和URL将从/p:MSDeployPublishingMethod=WMSVC自动派生。
  3. /p:ServerURL自定义参数未知,不会被映射到任何地方。

感谢您的回答。自从我最初的实验以来,我们已经取得了显著进展。现在,在TeamCity中我们有不同的构建、打包和部署步骤。部署步骤使用msdeploy.exe和每个环境参数XML文件。将参数保存在源代码控制下的XML文件中,已被证明是跟踪和控制部署时所需的新设置的绝佳方法。 - Michael12345

0
msbuild.exe {build-script.proj}  /property:{someParameter=someValue}

在您的构建脚本中,您可以使用$(someParameter)作为变量。

我的参数叫做ServerURL。如果我指定了msbuild /property参数,似乎它没有生效,但是parameters.xml中的默认值生效了。在我看来,仅仅将参数传递给MSBUILD.EXE并不能保证它会被MSDEPLOY使用。而且我认为它需要是someParameter=someValue的形式,即等号而不是冒号。 - Michael12345
我假设你正在导入你的xml文件。在这种情况下,在你导入文件之后,你需要覆盖该值。 <PropertyGroup> <ServerURL>$(ServerURLFromCommandLine)</ServerURL> </PropertyGroup> - Syam
Parameters.xml 似乎专门用于 MSDeployPublish 目标,它不包含 <PropertyGroup> 元素等,我认为它不会被 MSBuild 处理。 - Michael12345
请查看此解决方案(http://code.msdn.microsoft.com/Deploying-Web-Applications-9d9093c0) - Syam
谢谢你的建议Syam - 我之前没有看过那个示例,等我有时间了我会去看一下。目前我接受我自己得出的答案,因为它是最接近我卡住时的进展的。谢谢。 - Michael12345

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接