2013-03-22 97 views
3

我正在设置TeamCity将我们的网站项目应用程序(使用* .wdproj)和Web部署应用程序部署到IIS。如何通过命令行将MSDeploy样式参数传递给MSBuild?

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

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

我已经将一个parameters.xml文件添加到Web部署项目中,并且验证了这里设置的参数正在通过目标IIS服务器并正确应用 - 非常棒!

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

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

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

  2. 在管道的某个位置配置一个任务,以取得n个版本的参数1中的1个,并将其移入参数文件中,以便由其余管道获取。

我正在寻找最简单的方法在这一点上前进,欢迎任何建议。

供参考,在这里是我与现在尝试命令:

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

嗯,我想简短的答案是,用的MSBuild 4.0和VS2010,你不能只是通过任意参数为MSDeployPublish从电话到MSBuild。

我发现这些职位有帮助:

http://forums.iis.net/t/1167657.aspx/1 - 名臣的评论

http://www.hanselman.com/blog/TinyHappyFeatures3PublishingImprovementsChainedConfigTransformsAndDeployingASPNETAppsFromTheCommandLine.aspx - 理查德·绍洛伊的评论在底部

看完这些,并筛选通过Microsoft.Web.Publishing后.targets文件有一段时间试图找到一种“方式”,我最终决定在源代码控制的项目文件夹中有多个Parameters.xml副本,根据它们的环境进行标记,例如:

  • Parameters.Test。XML
  • Parameters.Staging.xml
  • Parameters.Live.xml

然后,包装前和部署,我只是将这些文件复制到的parameters.xml之一,它得到由回升管道的其余部分 - 完成!

BTW我有一个暂时性的问题,得到的parameters.xml复制及随后的清理到一个MSBuild.exe调用内工作,由于什么似乎是某种形式的文件访问问题,我在这里详细介绍吧:

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

+0

前段时间我做了类似的事情。我使用了msbuild命令,并且配置转换并为每个配置设置了发布设置。但我仍然需要做一些调整,因为我们有8个qa站点,而且我不想要8个qa config转换,所以我在msbuild任务之后复制了相应的params.xml文件(我为每个qa站点配置了一个teamcity构建配置),然后做了msdeploy,这是你可以添加你的skip,etc命令的地方。这听起来像是你现在走了好,还是还有障碍? – 2013-03-27 01:42:04

+0

我很好走!它可能不是最优雅的,但它现在工作。唷。我正在关闭这个项目的这个部分。 :-) – Michael12345 2013-03-27 03:55:27

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

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

+0

我的参数叫做ServerURL。如果我指定了msbuild/property参数,它似乎不起作用,但我在parameters.xml中的默认值。在我看来,仅仅传递一个参数到MSBUILD.EXE并不能保证它将被MSDEPLOY使用。另外我认为它需要是someParameter = someValue,即等号不是冒号。 – Michael12345 2013-03-22 09:34:27

+0

我假设你正在导入你的xml文件。在这种情况下,在您导入文件后,您需要覆盖该值。 <的PropertyGroup> $(ServerURLFromCommandLine) Syam 2013-03-26 15:42:18

+0

的parameters.xml似乎是专为使用MSDeployPublish目标的,它不包含<的PropertyGroup>元素等等,我不认为这是由MSBuild处理。 – Michael12345 2013-03-26 19:32:31

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:目标和/ p:DeployTarget是多余的。他们中的任何一个都足够了。也可以用/ p:WebPublishMethod替换它。
  2. 对于/ p:MSDeployServiceUrl,仅提供DNS名称或IP就足够了。端口和Url自动从/ ​​p:MSDeployPublishingMethod = WMSVC派生。
  3. 自定义参数/ p:ServerURL是未知的,不会映射到任何地方。
+0

感谢您的回答。自从我原来的实验以来,我们已经有了很大的进步我们现在在TeamCity中有独特的构建,打包和部署步骤。部署步骤使用msdeploy.exe和每个环境参数XML文件。在源代码控制下保存XML参数已被证明非常适用于跟踪和控制部署时所需的新设置。 – Michael12345 2017-05-01 21:57:05

相关问题