我想执行一个msbuild项目,该项目使用批处理来确定一个或多个csproj
项目是新建的,因此需要新的nuget包装。到目前为止我所做的脚本似乎是一个合理的开始,但增量构建机制不起作用。无论如何,MainBuild
目标每次都会执行。
这就是我所拥有的:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="MainBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)'=='' ">Debug</Configuration>
<Content>content\plugins\</Content>
</PropertyGroup>
<ItemGroup>
<Nuspec Include="$(MSBuildProjectDirectory)\plugins\*\*.nuspec" />
</ItemGroup>
<Target Name="MainBuild"
Inputs="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll"
Outputs="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" >
<ItemGroup>
<Inputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll" />
<Outputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" />
</ItemGroup>
<Message Text="INPUTS: %(Inputs.FullPath)" />
<Message Text="OUTPUTS: @(Outputs->'%(FullPath)')" />
<Copy SourceFiles="@(Inputs)" DestinationFiles="@(Outputs->'%(FullPath)')" />
</Target>
</Project>
Copy
任务只是一个调试占位符,用于调用nuget和创建新包。
这个想法是,如果bin\Debug
目录中的任何文件比相应的.nuspec文件(找到bin\Debug
上面的两个文件夹)更新,那么MainBuild
目标应该执行。< / p>
有什么想法吗?
P.S。 Inputs
的{{1}}和Outputs
属性可能都会创建一个项目。我觉得奇怪的是,创建的项目无法在目标内部引用。在上面的示例中,我必须创建一个target-interna动态ItemGroup来重新创建项目,以便我可以访问它们。有办法吗?
答案 0 :(得分:0)
我在MSBuild Batching documentation
中读到了这个内容如果目标内的任务使用批处理,则MSBuild需要确定 如果每批项目的输入和输出是最新的。 否则,每次击中目标都会执行。
这可能是最重要的。尝试更改复制目标以使用批处理而不是迭代转换(我不认为使用项目组中的项元数据满足上述要求)。
<Target Name="MainBuild"
Inputs="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll"
Outputs="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" >
<ItemGroup>
<Inputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll" />
<Outputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" />
</ItemGroup>
<Message Text="INPUTS: %(Inputs.FullPath)" />
<Message Text="OUTPUTS: @(Outputs->'%(FullPath)')" />
<Copy SourceFiles="@(Inputs)" DestinationFiles="%(Outputs.FullPath)" />
</Target>
看起来输入的数量可能与输出的数量不同(我怀疑每个项目的输出目录中有多个.dll文件),这也会导致目标执行。