MSBuild传递参数给CallTarget

我试图在我的MSBuild文件中创build一个可重用的目标,所以我可以用不同的参数多次调用它。

我有这样的骨架:

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

但我不能解决如何让parameter passing到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脚本的全path,以防您不想将“部署”发送到其他文件。

希望这可以帮助!

你可以用一个目标对一个ItemGroup进行“foreach”,只有你必须以明确的方式进行。 您甚至可以在项目中添加其他元数据,如代码示例中所示:

 <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生成的项目文件中find这个模式。

在MSBuild中可能有更好的方法,但在Ant中,我将使用全局属性将信息从一个任务传送到另一个任务。 这是一个糟糕的解决scheme,但当时我没有看到更好的办法。 你应该可以在MSBuild中做到这一点,但要记住,你将需要使用CreateProperty任务dynamic分配一个属性。

另一方面,在C#(或VB或其他)中实现任务相当简单。 也许这对你来说是一个更好的解决scheme。

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