2009-09-02 7 views
14

내 MSBuild 파일에 3 개의 속성을 선언하고 하나의 속성을 다른 대상의 값 (대상에 따라 다름)으로 덮어 쓰고 싶지만이를 수행하는 방법을 알 수 없습니다. 나는 그에 따라 값을의 설정 속성을 다시 선언하기 위해 노력하고있어,하지만이 작동하지 않는 순간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> 

: 내 빌드 파일은 다음과 같이 보인다.

답변

13

메멧 다른 속성에서 속성 값을 설정하는 방법에 대한 권리이지만, 동일한 대상에 CreateProperty 및 CallTarget를 호출하는 경우 그 새 속성이 없음을 의미합니다 MSBuild에서의 버그/기능이있다 다른 타깃에게 전 세계적으로 이용 가능하다 (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> 
+0

감사합니다. 유용했습니다. 나는 아직도 다소 일괄 처리에 익숙하지 않고 MS는 내 생각에 관련 개념을 설명하는 좋은 일을하지 않는다. 한 가지 더. 사실 글로벌 자산을 만들지 않고 떠났습니다. 컨텍스트가 조금 좁아 지므로 코드를 읽는 것이 더 쉽습니다. 대상 A는 대상 B와 C를 호출합니다. B는 목록 속성을 설정하고 C는 해당 속성의 값을 일괄 처리합니다. mdresser가 동일한 목표의 속성을 설정하는 것이 효과가 없다고 지적한 것처럼 누군가가 도움이되기를 바랍니다. 나는이 글을 발견하기 전에 이것을 이해하려고 3-4 시간을 보냈다. – AlexeiOst

+0

한 가지 더 요점은 Cat 만 변경되었다는 알림을 받고 변경 사항을 저장하려고 했습니까? 작동합니까? (나는 그것을 의심한다) –

8

CreateProperty 작업을 사용하면 기존 속성 값을 덮어 쓸 수 있습니다.

<Target Name="Deploy-LIVE"> 
    <CreateProperty Value="$(DeployPath_LIVE)"> 
    <Output PropertyName="DeployPath" TaskParameter="Value"/> 
    </CreateProperty> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 
+0

. CreateProperty 블록 바로 다음에 DeployPath 속성 값을 사용할 수는 있지만 Deploy-Sub 대상 내에서 값이 손실됩니다. –

+2

Haa, CreateProperty 작업에 버그/기능을 설명하는 http://weblogs.asp.net/bhouse/archive/2006/03/20/440648.aspx. –

+0

흥미로운이 버그에 대해 알지 못했습니다. 전에 CreateProperty를 사용했지만, 덮어 쓴 대상 외부에서 덮어 쓴 속성에 액세스하는 데 필요한 것은 없습니다. 감사. –

4

내가 일반적으로 CallTarget 작업을 피하십시오 :

그래서 여기에 문제의 최종 해결책이다. 대상 종속성을 사용하는 것이 훨씬 좋습니다.

+0

조금 더 자세히 설명해 주시겠습니까? 왜 더 나은가? –

+2

@HaymoKutschbach http://sedodream.com/PermaLink,guid,dd6cb1db-c0e4-47f7-ad84-6e59ff6b03d0.aspx 때문에 CallTarget은 msbuild가 어떻게 사용되어야하는지에 대한 정신적 모델에 반대한다고 생각합니다. MSBuild는 선언적이며 CallTarget은 매우 중요합니다. 거기에 필요한 몇 가지 경우가 있지만 CallTarget 전에 DependsOn 선호해야한다고 말했다. –

+0

감사! 나는 동의하고 msbuild 팀이 DependsOn을 권장하여 가져온 프로젝트에서 전역 적으로 속성을 설정할 수있게합니다. –

0

게다가, 당신은 방법를 사용할 수 있습니다 : 이것은 나를 위해 작동하지 않는 것

<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>