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脚本的情况下,你不想送“部署”到另一个文件FULLPATH。
希望这有助于!
其他提示
您可以“的foreach”在与目标的ItemGroup
,只有你有做,在declaritive方式。甚至可以有额外的元数据中的项目,像在代码示例:
<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做到这一点,但在蚂蚁,我会用全局属性从一个任务到下一个携带信息。这是一个糟糕的解决办法,但我没有看到在当时是一个更好的办法。你应该能够做到这一点的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"/>
不隶属于 StackOverflow