我使用MSBuild构建和部署Web应用程序。
MSBuild.exe MySite.csproj /p:DeployOnBuild=True /p:WebPublishMethod=MSDeploy /p:MSDeployServiceURL=mysite.example.com
我的网站连接到SQL Server数据库。
<connectionStrings>
<add name="dbconnection"
connectionString ="Data Source=(local);Initial Catalog=MySite;Integrated Security=SSPI;"
providerName="System.Data.SqlClient" />
</connectionStrings>
我是针对本地数据库开发的,但是当站点部署到测试服务器或生产服务器时,需要更改连接字符串。
我在名为dbconnection
parameters.xml
的部署参数
<parameter name="dbconnection"
defaultValue="Data Source={server};Initial Catalog={database};Integrated Security=SSPI;"
tags="DBConnectionString">
<parameterEntry type="XmlFile"
scope="\\Web.config$"
match="/configuration/connectionStrings/add[@name='dbconnection']/@connectionString"/>
</parameter>
我可以轻松创建参数化的Web部署包,并使用msdeploy进行部署。
msdeploy -verb:sync
-source:package:MySite.zip
-dest:iisApp="Site1/MySite"
-setParam:name=dbconnection,value="Data Source=.\SQLEXPRESS;Initial Catalog=MySiteTest;Integrated Security=SSPI"
但是,我真的希望能够在MSBuild中完成所有工作。什么是MSBuild等效于-setParam
?
答案 0 :(得分:1)
本地调试时不使用参数化。因此,您所要做的就是将parameters.xml文件中的defaultValue设置为所需的连接字符串。
我们为每个环境(DEV,QA,MOCK,PROD)创建一个SetParameters文件,并在MSBuild创建带有相应setParam文件的WebDeploy包之后调用MSDeploy。我不相信直接从MSBuild部署时可以使用自定义SetParameters文件。
这是一篇进一步描述参数化的文章:
更新:
史蒂文和我在SO之外进一步工作,以更好地了解他的用例。我们再次确认MSDeployPublish目标不支持设置参数值覆盖。为了解决他的用例,我写了一些MSBuild脚本来提供他正在寻找的功能,并写了一篇关于它的博客文章 -http://dotnetcatch.com/2014/09/08/parameterizationpreview-visual-studio-extension/
它基本上通过在MSBuild.exe命令行上通过MSBuild属性传递SetParameters文件或键/值对列表来工作。 MSBuild脚本通过设置MsDeployDeclareParameters ItemGroup来解析它并覆盖参数。
msdeploy.exe ... /p:MSDeployPublishSetParametersFile=SetParameters.Test.xml
msdeploy.exe ... /p:MSDeployPublishSetParameters=testSetting='changed_fromSetParam';IIS Web Application Name='Default Web Site/app13'