在 MSBuild 中设置 Web 部署参数值

Set Web Deploy parameter values in MSBuild

我使用 MSBuild 构建和部署 Web 应用程序。

 MSBuild.exe MySite.csproj /p:DeployOnBuild=True /p:WebPublishMethod=MSDeploy /p:MSDeployServiceURL=mysite.example.com

我的站点连接到 SQL 服务器数据库。

<connectionStrings>
  <add name="dbconnection"
       connectionString ="Data Source=(local);Initial Catalog=MySite;Integrated Security=SSPI;"
       providerName="System.Data.SqlClient" />
</connectionStrings>

我针对本地数据库进行开发,但是在将站点部署到测试或生产服务器时需要更改连接字符串。

我在名为 parameters.xml

的文件中声明了一个名为 dbconnection 的部署参数
<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>

我可以很容易地创建一个参数化的网络部署包并使用 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 中做所有事情。 -setParam 的 MSBuild 等价物是什么?

本地调试时不使用参数化。因此,您所要做的就是将 parameters.xml 文件中的默认值设置为所需的连接字符串。

我们为每个环境(DEV、QA、MOCK、PROD)创建一个 SetParameters 文件,并在 MSBuild 使用适当的 setParam 文件创建 WebDeploy 包后调用 MSDeploy。我不认为直接从 MSBuild 部署时可以使用自定义 SetParameters 文件。

这是进一步描述参数化的post:

http://dotnetcatch.com/2014/09/08/parameterizationpreview-visual-studio-extension/

更新:

Steven 和我在 SO 之外进一步工作,以更好地理解他的用例。我们再次确认 MSDeployPublish 目标不支持设置参数值覆盖。为了解决他的用例,我编写了一些 MSBuild 脚本来提供他正在寻找的功能,并写了一篇关于它的博客 post -

http://dotnetcatch.com/2016/04/27/setparameters-via-msbuild-commandline/

它基本上是通过 MSBuild.exe 命令行上的 MSBuild 属性传递 SetParameters 文件或 key/value 对列表来工作的。 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'