MSBuild 将参数传递给 CallTarget
Posted
技术标签:
【中文标题】MSBuild 将参数传递给 CallTarget【英文标题】:MSBuild passing parameters to CallTarget 【发布时间】:2010-12-02 21:51:39 【问题描述】:我正在尝试在我的 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
本身。
【问题讨论】:
【参考方案1】: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 脚本的完整路径,以防您不想将“部署”发送到另一个文件。
希望这会有所帮助!
【讨论】:
【参考方案2】:您可以使用目标“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 生成的项目文件中随处找到这种模式。
【讨论】:
【参考方案3】: <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"/>
【讨论】:
CreateProperty 在 V4 中已被弃用。改为在 Target 中使用 PropertyGroup。参考:msdn.microsoft.com/en-us/library/ms171458.aspx【参考方案4】:在 MSBuild 中可能有更好的方法来执行此操作,但在 Ant 中,我会使用全局属性将信息从一个任务传递到下一个任务。这是一个糟糕的解决方案,但当时我没有看到更好的方法。您应该可以在 MSBuild 中执行此操作,但请记住,您需要使用 CreateProperty
任务来动态分配属性。
另一方面,在 C#(或 VB 或其他)中实现任务非常容易。也许这对你来说是一个更好的解决方案。
【讨论】:
以上是关于MSBuild 将参数传递给 CallTarget的主要内容,如果未能解决你的问题,请参考以下文章
如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数