-->

的NuGet包的增量编译(Incremental Build of Nuget Packages)

2019-10-29 19:04发布

我想执行它使用批处理来确定一个或多个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目录比相应的.nu​​spec文件(找到两个文件夹上面更新bin\Debug ),那么MainBuild目标应该执行。

有任何想法吗?

PS的InputsOutputs的的属性Target大概每创建一个项。 我觉得很奇怪,创建的项目无法在目标内引用。 在上面的例子中,我不得不做出一个目标INTERNA动态的ItemGroup重新创建的项目,只是这样我就可以访问它们。 有没有办法解决,一个方法是什么?

Answer 1:

我的在读这MSBuild的配料文档

如果目标内部的任务使用配料,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文件为每个项目)的输出的数目,这也将导致目标来执行不同的。



文章来源: Incremental Build of Nuget Packages