2013-01-02 58 views
0

我想执行一个msbuild项目,它使用批处理来确定一个或多个csproj项目已经新建,因此需要新的nuget包装。我迄今为止编写的脚本似乎是一个合理的开始,但增量构建机制不起作用。无论如何,每次都执行MainBuild目标。增量构建的Nuget包

以下是我有:

<?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.s. TargetInputsOutputs属性可能每个都创建一个项目。我觉得奇怪的是创建的项目不能在目标内引用。在上面的例子中,我必须制作一个target-interna动态ItemGroup重新创建项目,以便我可以访问它们。有没有办法解决这个问题?

回答

0

我在MSBuild Batching documentation

阅读本如果目标内部的任务使用配料,MSBuild的需要确定 如果项目每批投入和产出是最新的更新。否则,每次击中目标时都执行该目标。

这可能是cuprit。尝试改变你的复制目标,以使用批处理而不是ite转换(我不认为使用项目组中的项目元数据满足上述要求)。

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

它看起来像的输入的数量可以比(I怀疑有在输出目录多于一个的.dll文件为每个项目)的输出的数目,这也将导致目标来执行不同的。

+0

发布后,我改变了目标'Inputs'只有一个DLL。这突然“解决”了问题。我留下的印象是,msbuild“增量构建”机制是如此原始,以至于它可能不应该作为一个功能被列出或公布;很少有增量构建依赖于输入和输出的匹配数量。 –

+0

相信这里的问题是它不支持通配符。不知何故,你必须将输入项输入到一个项目组中,这个项目组首先会让我的配料与增量构建(又称输入/输出)不兼容, –