3
votes

In my Parameters.xml file, I have a couple of parameters that use the Web Deploy "variable" syntax to refer to other parameters, like this one that refers to the IIS Web Application Name parameter:

<parameter name="MyParam"
           defaultValue="{IIS Web Application Name}/Web.config"
           tags="Hidden"/>

My problem is that VS automatically imports this parameter into my SetParameters.xml file when I build the deployment package in spite of it being tagged as hidden. When it is passed to msdeploy via setParamFile, Web Deploy literally interprets the value of the parameter as

{IIS Web Application Name}/Web.config

rather than substituting the IIS application name.

If I remove the parameter from the auto-generated SetParameters.xml file, the variable works as expected. Is there any way to prevent VS from including that parameter in the first place, either by name or by tag?

2
Can you explain why you are actually wanting to include the {IIS Web Application Name} macro, so we can look for an alternative? - kroonwijk
MyParam is used as an argument to the setAcl provider - we use it to make Web.config (and a couple of other files) writable for our deployment-time configuration tool. An earlier question of mine might help explain exactly why the IIS application name is necessary. - ladenedge

2 Answers

1
votes

This was actually far easier than I thought, given the answer to my earlier question.

I just needed to add a Hidden tag in the target that follows AddIisAndContentDeclareParametersItems. This apparently sets the tag in the source manifest prior to the package being built. It ends up looking something like this:

<Target Name="DeclareCustomParameters" 
        AfterTargets="AddIisAndContentDeclareParametersItems">
  <ItemGroup>
    <MsDeployDeclareParameters Include="Foo">
      <!-- <snip> -->
      <!-- the following elements are the important ones: -->
      <Tags>Hidden</Tags>  
      <ExcludeFromSetParameter>True</ExcludeFromSetParameter>
    </MsDeployDeclareParameters>
  </ItemGroup>
</Target>

That was it!

0
votes

This answer is for anyone else looking for a more complete example of substitution via targets. This example shows substituting a variable "database server name" into a connection string.

The ExcludeFromSetParameter element appears to be the key to making substitution work as it keeps the param out of the SetParameters.xml file (as the OP mentioned he did manually). Unfortunately, I don't think that ExcludeFromSetParameter can be set from a parameters.xml file, so this is the only option...

<Target Name="DeclareCustomParameters" BeforeTargets="Package">
    <ItemGroup>

        <MsDeployDeclareParameters Include="DatabaseServer">
            <Description>Location of the database server hosting the user database</Description>
            <Value>localhost</Value>
            <DefaultValue>localhost</DefaultValue>
            <Tags>DBServer, SQL</Tags>
        </MsDeployDeclareParameters>    

        <MsDeployDeclareParameters Include="DB Connection String">
            <Kind>XmlFile</Kind>
            <Scope>Web.config</Scope>
            <Match>/configuration/connectionStrings/add[@name='Database']/@connectionString</Match>
            <Description>The connection string to the Database</Description>
            <DefaultValue>Data Source={DatabaseServer};Initial Catalog=MyDatabase;Integrated Security=true;MultipleActiveResultSets=true;</DefaultValue>
            <Tags>Hidden</Tags>
            <ExcludeFromSetParameter>True</ExcludeFromSetParameter>
        </MsDeployDeclareParameters>

    </ItemGroup>
</Target>