MSBuild 매개 변수를 CallTarget에 전달합니다
-
19-09-2019 - |
문제
MSBuild 파일에서 재사용 가능한 대상을 만들려고 노력하여 다른 매개 변수로 여러 번 호출 할 수 있습니다.
나는 다음과 같은 골격이 있습니다.
<Target Name="Deploy">
<!-- Deploy to a different location depending on parameters -->
</Target>
<Target Name="DoDeployments">
<CallTarget Targets="Deploy">
<!-- Somehow indicate I want to deploy to dev -->
</CallTarget>
<CallTarget Targets="Deploy">
<!-- Somehow indicate I want to deploy to testing -->
</CallTarget>
</Target>
그러나 나는 매개 변수를 CallTarget
, 그런 다음 차례로 Target
그 자체.
해결책
MSBuild 대상은 매개 변수를 수신하도록 설계되지 않았습니다. 대신, 그들은 당신이 그들을 위해 정의하는 속성을 사용합니다.
<PropertyGroup>
<Environment>myValue</Environment>
</PropertyGroup>
<Target Name="Deploy">
<!-- Use the Environment property -->
</Target>
그러나 일반적인 시나리오는 다른 매개 변수 (즉, 여러 웹 사이트를 배포)로 대상을 여러 번 호출하는 것입니다. 이 경우 MSBuild를 사용합니다 MSBuild
작업을 수행하고 매개 변수를 속성으로 보내십시오.
<Target Name="DoDeployments">
<MSBuild Projects ="$(MSBuildProjectFullPath)"
Properties="VDir=MyWebsite;Path=C:\MyWebsite;Environment=$(Environment)"
Targets="Deploy" />
<MSBuild Projects ="$(MSBuildProjectFullPath)"
Properties="VDir=MyWebsite2;Path=C:\MyWebsite2;Environment=$(Environment)"
Targets="Deploy" />
</Target>
$(MSBuildProjectFullPath)
"배포"를 다른 파일로 보내지 않으려는 경우 현재 MSBuild 스크립트의 전체 경부입니다.
도움이 되었기를 바랍니다!
다른 팁
당신은 'foreach'를 할 수 있습니다 ItemGroup
목표를 사용하면 선언적 방식으로 만해야합니다. 코드 예제와 같이 항목에 추가 메타 데이터가있을 수도 있습니다.
<ItemGroup>
<What Include="Dev">
<How>With bugs</How>
</What>
<What Include="Test">
<How>With tests</How>
</What>
<What Include="Chicken">
<How>Deep fried</How>
</What>
</ItemGroup>
<Target Name="Deploy">
<Message Text="@(What), %(How)" />
</Target>
아이템 그룹을 스칼라 값으로 사용합니다 @(What)
대상 내부에서 트릭을 수행합니다 %(How)
Foreach 항목의 메타 데이터 요소를 참조하십시오.
예를 들어 MSBuild에서 일을하는 자연스러운 방법입니다. 예를 들어 Visual Studio로 생성 된 프로젝트 파일의 모든 곳 에서이 패턴을 찾을 수 있습니다.
MSBuild에서는 더 나은 방법이있을 수 있지만 Ant에서는 글로벌 속성을 사용하여 한 작업에서 다음 작업으로 정보를 전달할 것입니다. 그것은 거친 해결책 이었지만 당시에는 더 나은 방법을 보지 못했습니다. MSBuild 에서이 작업을 수행 할 수 있어야하지만 사용해야한다는 점을 명심하십시오. CreateProperty
재산을 동적으로 할당하는 작업.
반면에 C# (또는 VB 또는 무엇이든)에서 작업을 구현하는 것은 매우 쉽습니다. 어쩌면 그것은 당신에게 더 나은 솔루션일지도 모릅니다.
<CreateProperty
Value="file1">
<Output
TaskParameter="Value"
PropertyName="filename" />
</CreateProperty>
<CallTarget Targets="Deploy"/>
<Message Text="$(filename)"/>
<CreateProperty
Value="file2">
<Output
TaskParameter="Value"
PropertyName="filename" />
</CreateProperty>
<Message Text="$(filename)"/>
<CallTarget Targets="Deploy"/>