代码之家  ›  专栏  ›  技术社区  ›  Matthew Dresser

用MSBuild覆盖属性

  •  16
  • Matthew Dresser  · 技术社区  · 16 年前

    我想在MSBuild文件中声明三个属性,并用另一个属性的值覆盖一个属性(取决于调用的目标),但不知道如何执行此操作。我的生成文件如下所示:

    <PropertyGroup>
       <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST>
       <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE>
       <DeployPath></DeployPath>
    </PropertyGroup>
    
    <Target Name="Deploy-TEST">
       <PropertyGroup>
          <DeployPath>$(DeployPath_TEST)</DeployPath>
       </PropertyGroup>
       <CallTarget Targets="Deploy-Sub"/>
    </Target>
    
    <Target Name="Deploy-LIVE">
       <PropertyGroup>
          <DeployPath>$(DeployPath_TEST)</DeployPath>
       </PropertyGroup>
       <CallTarget Targets="Deploy-Sub"/>
    </Target>
    
    <Target Name="Deploy-Sub">
       <Message Text="Deploying to $(DeployPath)"/>
       <MSBuild Projects="MySolution.csproj" Targets="Rebuild" />
    
       <ItemGroup>
         <MyFiles Include="**\*"/>
       </ItemGroup>
    
       <Copy SourceFiles="@(MyFiles)" 
             DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/>
    
    </Target>
    

    目前,我正试图重新声明属性,并相应地设置其值,但这不起作用。

    4 回复  |  直到 16 年前
        1
  •  17
  •   Matthew Dresser    16 年前

    Mehmet在如何从另一个属性设置属性值方面是正确的,但是MSBuild中有一个bug/特性,这意味着 如果在同一目标中调用CreateProperty和CallTarget,则其他目标将无法全局使用您的新属性 described here ).

    <PropertyGroup>
       <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST>
       <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE>
       <DeployPath></DeployPath>
    </PropertyGroup>
    
    <Target Name="SetDeployPath-TEST">
      <CreateProperty Value="$(DeployPath_TEST)">
        <Output TaskParameter="Value" PropertyName="DeployPath"/>
      </CreateProperty>
    </Target>
    
    <Target Name="Deploy-TEST">
       <CallTarget Targets="SetDeployPath-TEST"/>
       <CallTarget Targets="Deploy-Sub"/>
    </Target>
    
    <Target Name="Deploy-Sub">
      <Message Text="Deploying to $(DeployPath)"/>
      <MSBuild Projects="MySolution.csproj" Targets="Rebuild" />
    
      <ItemGroup>
        <MyFiles Include="**\*"/>
      </ItemGroup>
    
      <Copy SourceFiles="@(MyFiles)" 
         DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/>
    
    </Target>
    
        2
  •  9
  •   Mehmet Aras    16 年前

    你可以用 CreateProperty 任务覆盖现有属性的值。

    <Target Name="Deploy-LIVE">   
      <CreateProperty Value="$(DeployPath_LIVE)">
        <Output PropertyName="DeployPath" TaskParameter="Value"/>
      </CreateProperty>
      <CallTarget Targets="Deploy-Sub"/>
    </Target>
    
        3
  •  4
  •   Sayed Ibrahim Hashimi    16 年前

    CallTarget 任务更好的方法是使用目标依赖项。

        4
  •  0
  •   hieu nguyen    11 年前

    <PropertyGroup>
       <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST>
       <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE>
       <DeployPath></DeployPath>
    </PropertyGroup>
    
    <Target Name="SetDeployPath-TEST">
      <CreateProperty Value="$(DeployPath_TEST)">
        <Output TaskParameter="Value" PropertyName="DeployPath"/>
      </CreateProperty>
    </Target>
    
    <Target Name="Deploy-Sub" DependsOnTargets="SetDeployPath-TEST">
      <Message Text="Deploying to $(DeployPath)"/>
      <MSBuild Projects="MySolution.csproj" Targets="Rebuild" />
    
      <ItemGroup>
        <MyFiles Include="**\*"/>
      </ItemGroup>
    
      <Copy SourceFiles="@(MyFiles)" 
         DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/>
    
    </Target>