Search code examples
msbuildwebdeploy

Set Web Deploy parameter values in MSBuild


I use MSBuild to build and deploy a web application.

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

My site connects to a SQL Server database.

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

I develop against a local database, but the connection string needs to be changed when the site is deployed to test or production servers.

I have declared a deployment parameter named dbconnection in a file named 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>

I could easily create a parameterized web deploy package and deploy it with 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"

However, I'd really like to be able to do everything in MSBuild. What is the MSBuild equivalent of -setParam?


Solution

  • Parameterization is not used when debugging locally. So all you should have to do is set the defaultValue in your parameters.xml file to your desired connection string.

    We create a SetParameters file for each environment (DEV, QA, MOCK, PROD) and call MSDeploy after MSBuild creates a WebDeploy package with the appropriate setParam file. I don't believe there is way to use a custom SetParameters file when deploying directly from MSBuild.

    Here is a post that further describes parameterization:

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

    UPDATE:

    Steven and I worked further outside of SO to understand his use cases better. We confirmed again the MSDeployPublish target does not support setting parameter value overrides. To solve his use case I wrote some MSBuild script to provide the functionality he was looking for and wrote a blog post about it -

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

    It basically works by passing a SetParameters file or list of key/value pairs via MSBuild Properties on the MSBuild.exe commandline. The MSBuild script parses that out and overrides the parameters by setting the MsDeployDeclareParameters ItemGroup.

    msdeploy.exe ... /p:MSDeployPublishSetParametersFile=SetParameters.Test.xml
    msdeploy.exe ... /p:MSDeployPublishSetParameters=testSetting='changed_fromSetParam';IIS Web Application Name='Default Web Site/app13'