2017-05-09 4 views
3

여러 프로젝트가있는 솔루션이 있으며 솔루션 수준의 공통 파일에서 한 번 정의 된 공유 속성 집합에 모두 액세스 할 수있게하고 싶습니다.가져온 속성을 기반으로 한 MSBuild 조건

이것은 주로 아래 코드를 사용하여 잘 작동하며 BeforeBuild 대상에서 가져온 속성을 사용할 수 있습니다. 그러나 문제는 내가 가져온 속성을 조건에 사용할 수 없다는 것입니다.

내 프로젝트 파일에서
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="CommonSettingsTarget"> 
     <PropertyGroup> 
      <MyCustomProperty>Sample</MyCustomProperty> 
     </PropertyGroup> 
    </Target> 
</Project> 

내가 가진 : 위의에서

<Project ToolsVersion="14.0" DefaultTargets="Build" InitialTargets="CommonSettingsTarget" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(SolutionDir)CommonSettings.targets" /> 

    <ItemGroup> 
    <EmbeddedResource Include="EmbeddedDocument.txt" Condition=" '$(MyCustomProperty)' == 'Sample' " /> 
    </ItemGroup> 

    <Target Name="BeforeBuild"> 
    <Message Text="MyCustomProperty='$(MyCustomProperty)'" Importance="high" /> 
    </Target> 
</Project> 

, 내 수입을 볼 수 있습니다

은 그래서 솔루션 폴더에 CommonSettings.targets 파일에 다음 한 속성은 출력 창에 "MyCustomProperty = 'Sample'"로 표시됩니다. 그러나 조건의 일부로 사용되는 경우 (포함 된 리소스를 선택적으로 포함하기 위해) 조건이 충족되지 않습니다.

가져온 속성을 조건과 함께 사용할 수있는 방법이 있습니까? 사용자의 상태가 평가 될 때 CommonSettingsTarget 아직 실행되지 않았으며, 따라서 MyCustomProperty 아직 정의되지 않은 해당 ItemGroup로서

+1

다른 조언 : VS 2017/MSbuild 15로 전환하면 가져온 파일'Directory.Build.props'의 이름을 지정하면 해당 레벨 아래의 모든 프로젝트에 자동으로 가져옵니다. –

답변

3

타겟 내에 아니지만 PropertyGroup이다.

Message 작업은 CommonSettingsTarget에 따라 달라집니다 메시지를 만들 때 이렇게 MyCustomProperty가 정의 된 BeforeBuild 대상 내에서 호출됩니다.


Import은 가져온 프로젝트를 프로젝트 파일로 복사하는 것으로 생각하십시오.

<Project ToolsVersion="14.0" DefaultTargets="Build" InitialTargets="CommonSettingsTarget" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="CommonSettingsTarget"> 
    <PropertyGroup> 
     <MyCustomProperty>Sample</MyCustomProperty> 
    </PropertyGroup> 
    </Target> 

    <ItemGroup> 
    <EmbeddedResource Include="EmbeddedDocument.txt" Condition=" '$(MyCustomProperty)' == 'Sample' " /> 
    </ItemGroup> 

    <Target Name="BeforeBuild"> 
    <Message Text="MyCustomProperty='$(MyCustomProperty)'" Importance="high" /> 
    </Target> 
</Project> 

이 발생하는 것입니다 :

  1. 당신은이을 실행할 때 MyCustomProperty를 정의하는 대상 CommonSettingsTarget을 정의 결과는 다음과 같이 될 것이다. 지금은 아니야.
  2. ItemGroup을 정의하고 조건을 평가하십시오. MyCustomProperty이 아직 정의되지 않았으므로 false을 반환합니다.
  3. 대상을 BeforeBuild으로 정의하십시오.
  4. 초기 타겟을 실행합니다 (예 : CommonSettingsTarget). 이제 MyCustomProperty이 정의됩니다.
  5. BeforeBuild에 의존하는 기본 대상을 실행하여 BeforeBuild을 실행합니다. 이 당신이 솔루션으로

4 단계에서 정의 된 MyCustomProperty 평가의 CommonSettingsTarget 대상을 제거하고 CommonSettings에서 Project의 자식으로 PropertyGroup을 정의합니다.대신 대상 :

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <MyCustomProperty>Sample</MyCustomProperty> 
    </PropertyGroup> 
</Project> 

프로젝트 파일에서 InitialTargets="CommonSettingsTarget"을 제거해야합니다.

+0

정보 주셔서 감사합니다. 프로젝트에서 속성을 구체적으로 정의하면 작동하지만 솔루션 내에서 속성에 액세스해야하는 많은 프로젝트가 있으며 조정해야 할 때마다 각 프로젝트의 값을 변경해야합니다. 그들. 프로젝트 자체의 InitialTargets가 수행했을 수도 있다고 생각했지만 수입 전에 항상 조건이 평가되는 것처럼 보입니까? –

+0

@ 대니얼 스미스는 제 편집을 참조하십시오. – wkl

+0

나는 당신이 지금 무슨 뜻인지 안다. 이제는 내 공통 속성을 완벽하게 가져 와서 사용하고 있습니다. 분명히 모든 목표를 지나치게 복잡하게 만들었습니다. 고맙습니다. 나는 대답으로 표시 할 것입니다 :-) –

관련 문제