3

我正在设置 TeamCity 以将我们的网站项目应用程序(使用 *.wdproj)和 Web 部署应用程序部署到 IIS。

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

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

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

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

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

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

  2. 在管道中的某处配置一个任务,以获取 parameters.something.xml 的 n 个版本中的 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 的值(我在 parameters.xml 中定义的一个参数)没有进入目标站点之外,它运行良好。然而,我在 parameters.xml 中指定的默认值是。所以我知道参数正在工作,我只是不知道如何将它们添加到 msbuild 命令行。

4

3 回答 3

3

好吧,我认为简短的回答是,使用 MSBuild 4.0 和 VS2010,您不能将任意参数从调用 MSBuild 传递到 MSDeployPublish。

我发现这些帖子很有帮助:

http://forums.iis.net/t/1167657.aspx/1 - 陈明的评论

http://www.hanselman.com/blog/TinyHappyFeatures3PublishingImprovementsChainedConfigTransformsAndDeployingASPNETAppsFromTheCommandLine.aspx - Richard Szalay 在底部的评论

在阅读了这些内容并筛选了 Microsoft.Web.Publishing.targets 文件一段时间试图找到“进入”之后,我最终决定在源代码管理的项目文件夹中拥有多个 Parameters.xml 副本,根据标记他们的环境,例如:

  • 参数.Test.xml
  • 参数.Staging.xml
  • 参数.Live.xml

然后,在打包和部署之前,我只需将其中一个文件复制到 Parameters.xml 中,它就会被管道的其余部分拾取 - 完成!

顺便说一句,由于似乎是某种文件访问问题,我在单个 MSBuild.exe 调用中获取 parameters.xml 副本和随后的清理工作时遇到了一个临时问题,我在这里详细说明了:

MSBuild.exe 复制任务无法正常工作,除非该文件的某个版本已出现在目标中

于 2013-03-23T21:55:39.960 回答
1

要回答您的问题,命令行的参数化不是 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 是未知的,不会映射到任何地方。
于 2017-05-01T15:15:16.523 回答
0
msbuild.exe {build-script.proj}  /property:{someParameter=someValue}

In your build script you can use $(someParameter) as a variable

于 2013-03-22T05:01:14.977 回答