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

如何通过命令行将MSDeploy样式参数传递给MSBuild?,msbuild,teamcity,msdeploy,webdeploy,Msbuild,Teamcity,Msdeploy,Webdeploy,我正在设置TeamCity以将我们的网站项目应用程序(使用*.wdproj)和Web部署应用程序部署到IIS 我有一个生成配置,它使用MSBuild.exe和MSDeployPublish来生成并部署应用程序 我们现在希望将应用程序部署到多个目标环境,因此需要一种基于目标环境提供不同设置的方法 我已将parameters.xml文件添加到Web部署项目中,并已验证此处设置的参数是否一直通过目标IIS服务器并正确应用-太棒了 现在我要做的是,每个环境有不同的参数设置。我希望可以使用类似MSDepl

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

我有一个生成配置,它使用MSBuild.exe和MSDeployPublish来生成并部署应用程序

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

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

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

msbuild.exe {build-script.proj}  /property:{someParameter=someValue}
我怀疑我可能需要执行以下操作之一:

  • 将MSBuild和MSDeploy拆分为单独的生成步骤

  • 将管道中的某个位置的任务配置为获取n个版本的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的值(我在parameters.xml中定义了一个参数)没有进入目标站点之外。但是,我在parameters.xml中指定的默认值是。因此,我知道这些参数正在工作,但我不知道如何将它们添加到msbuild命令行

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

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

    好吧,我认为简单的答案是,对于MSBuild 4.0和VS2010,您不能从对MSBuild的调用中将任意参数传递到MSDeployPublish

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

    -陈明的评论

    -底部Richard Szalay的评论

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

    • Parameters.Test.xml
    • Parameters.Staging.xml
    • Parameters.Live.xml
    然后,在打包和部署之前,我只需将这些文件中的一个复制到Parameters.xml中,它就会被管道的其余部分接收——完成

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


    为了回答您的问题,命令行的参数化与MSBuild无关。相反,您应该使用外部工具。例如,如果从批处理文件运行msbuild命令,则可以将参数传递给批处理文件,并针对具有不同参数的每个环境运行该命令。另一种方法是使用TeamCity或VSTS之类的构建系统,并利用它们的参数化机制。适用于VST或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)
    
    此外,我建议对您的原始命令行进行一些清理:

  • 同时使用/p:target和/p:DeployTarget是多余的。只要一个就够了。也可以用/p:WebPublishMethod替换
  • 对于/p:MSDeployServiceUrl,仅提供DNS名称或IP就足够了。端口和Url自动从/p:MSDeployPublishingMethod=WMSVC派生
  • 自定义参数/p:ServerURL未知,不会映射到任何位置

  • 我的参数称为ServerURL。如果指定msbuild/property参数,它似乎不会生效,但parameters.xml中的默认值会生效。在我看来,仅仅向MSBUILD.EXE传递一个参数并不能保证MSDEPLOY会使用它。我还认为它需要是someParameter=someValue,即等号而不是冒号。在这种情况下,导入文件后,需要覆盖该值$(ServerURLFromCommandLine)Parameters.xml似乎专门用于MSDeployPublish目标,它不包含元素等。我认为它不是由MSBuild处理的。请查看此解决方案()感谢您的建议Syam-我以前没有看到过该示例,有时间我会查看它。现在我接受我得到的答案,因为这是我陷入困境时最接近的答案。谢谢。我刚才做了类似的事情。我使用了msbuild命令,进行了配置转换,并为每个配置设置了发布设置。但是我仍然需要一些调整,因为我们有8个qa站点,我不需要8个qa配置转换,所以在执行msbuild任务后,我复制了相应的params.xml文件(我为每个qa站点复制了一个teamcity构建配置),然后复制了msdeploy,您可以在其中添加skip等命令。听起来你现在可以走了,或者还有什么障碍吗?我可以走了!它可能不是最优雅的,但它目前正在发挥作用。呸。我正在关闭项目这一部分的大门。:-)谢谢你的回答。自从我最初的实验以来,我们取得了显著的进步。我们现在在TeamCity中有了不同的构建、打包和部署步骤。部署步骤使用msdeploy.exe和每环境参数XML文件。事实证明,在源代码控制下保存XML中的参数对于跟踪和控制部署时所需的新设置是非常好的。