如何通过命令行将MSDeploy样式的参数传递给MSBuild?

时间:2013-03-22 04:36:24

标签: msbuild teamcity msdeploy webdeploy

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

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

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

我已将一个parameters.xml文件添加到Web部署项目中,并已验证此处设置的参数是否已通过目标IIS服务器并正确应用 - 非常好!

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

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

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

  2. 在管道中的某个位置配置任务,以获取n个版本的parameters.something.xml中的1个并将其移动到parameters.xml中,以便其他管道获取它。

  3. 我正在寻找最简单的方法来推进这一点,欢迎任何建议。

    供参考,这是我现在正在试验的命令:

    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命令行。

3 个答案:

答案 0 :(得分: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副本,根据他们的环境进行标记,例如:

  • Parameters.Test.xml
  • Parameters.Staging.xml
  • Parameters.Live.xml

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

BTW我有一个临时问题,因为看起来像某种文件访问问题,在一个MSBuild.exe调用中使用parameters.xml副本和后续清理工作,我在这里详细说明了:

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

答案 1 :(得分: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)

此外,我建议您对origianl命令行进行一些清理:

  1. 同时使用/ p:target和/ p:DeployTarget是多余的。其中任何一个都足够了。它也可以用/ p代替:WebPublishMethod。
  2. 对于/ p:MSDeployServiceUrl仅提供DNS名称或IP就足够了。端口和Url自动派生自/ p:MSDeployPublishingMethod = WMSVC。
  3. 自定义参数/ p:ServerURL未知,不会映射到任何地方。

答案 2 :(得分:0)

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

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