Search code examples
msbuildmsbuild-task

Property scope using msbuild extension pack detokenise


Im trying to use the msbuild extensions pack to fix up the configuration of our app on deploy, i want to be able to pass a property (ENV) which will load my environment specific config file to use with the detokeniser, and fix up my application configs. Like this:

    <UsingTask TaskName="MSBuild.ExtensionPack.FileSystem.Detokenise"
           AssemblyFile=".\Tools\MSBuild Extension Pack 4.0.3.0\MSBuild.ExtensionPack.dll"/>
<Import Project=".\Environments\$(Env).properties"/>
<Target Name="Build" >
    <ItemGroup>
        <SourceTemplates Include=".\Templates\**\*.*"/>
    </ItemGroup>

    <RemoveDir Directories=".\Temp"/>
    <MakeDir Directories=".\Temp"/>

    <Message Text="@(SourceTemplates)"/>

    <Copy SourceFiles="@(SourceTemplates)"
          DestinationFolder=".\Temp\%(RecursiveDir)" />

    <ItemGroup>
        <TargetTemplates Include=".\Temp\**\*.*"/>
    </ItemGroup>

    <MSBuild.ExtensionPack.FileSystem.Detokenise
         TaskAction="Detokenise"
         TargetFiles="@(TargetTemplates)"/>
</Target>

So i call this using

msbuild Detokenise.msbuild /p:Env=Prod

Msbuild knows about my file and i have access to its properties, but when the detokeniser runs i get the error:

Detokenise Task Execution Completed [15:07:50]
C:\Source\1.2\Build\Detokenise.msbuild(27,3):
error : InvalidProjectFileException: The imported project "C:\Source\1.2\Build\Environments\.properties" was not found.
Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
C:\Source\1.2\Build\Detokenise.msbuild\r
C:\Source\1.2\Build\Detokenise.msbuild(27,3): error :

All works fine if i hard code it- Any ideas how to solve this. I thought of doing some text replacement on the msbuild before i execute...


Solution

  • You could try to assign this parameter to a local property:

    <PropertyGroup Condition="'$(Env)'=='Prod'">
        <TargetEnv>Prod</TargetEnv>
    </PropertyGroup>
    
    <!-- add other environments as needed -->
    <PropertyGroup Condition="'$(Env)'=='Test'">
        <TargetEnv>Test</TargetEnv>
    </PropertyGroup>
    
    <Import Project=".\Environments\$(TargetEnv).properties"/>
    

    You could also try to enclose your parameter value in quotes:

    msbuild Detokenise.msbuild /p:"Env=Prod"
    

    As is your problem can't be reproduced, so it may be a side effect of other parameters not shown in your sample code.