从作为字符串的文件到对msbuild中文件的引用 背景

从作为字符串的文件到对msbuild中文件的引用 背景,msbuild,Msbuild,由于CopyLocal=true会随着项目和解决方案规模的增长而导致大量构建速度减慢(请参阅),因此我正在尝试找到一种基于约定的解决方案,该解决方案可以与nuget一起使用并执行增量构建,在必要时只复制程序集及其相关文件,如pdb 以下是我目前掌握的情况: <!-- Assumptions: each project copies all of its required dependencies to the same output directory. I ha

由于
CopyLocal=true
会随着项目和解决方案规模的增长而导致大量构建速度减慢(请参阅),因此我正在尝试找到一种基于约定的解决方案,该解决方案可以与nuget一起使用并执行增量构建,在必要时只复制程序集及其相关文件,如pdb

以下是我目前掌握的情况:

<!--
    Assumptions: each project copies all of its required dependencies
    to the same output directory.

    I have two basic options here. I can look at @(Reference) and pull
    the HintPath information to copy the correct assemblies, or I can
    use @(ReferencePath) which gives me a list of all the different
    required assemblies. The latter doesn't allow me to distinguish
    system ones from ones that I have explicitly included. I could
    probably include the non-system ones by filtering to some sub-
    directory of the solution.
-->
<ItemGroup>
  <_AssembliesToCopy Include="..\..\packages\Moq.4.0.10827\lib\NET40\Moq.dll" />
  <_AssembliesToCopy Include="..\..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll" />
  <!-- ... -->
</ItemGroup>
<PropertyGroup>
  <AfterBuildDependsOn>
    $(AfterBuildDependsOn);
    CopyReferencedAssemblies;
    CopyFilesRelatedToReferencedAssemblies
  </AfterBuildDependsOn>
</PropertyGroup>
<Target Name="AfterBuild" DependsOnTargets="$(AfterBuildDependsOn)" />
<Target Name="CopyFilesRelatedToReferencedAssemblies"
  Inputs="@(_ReferenceRelatedPaths)"
  Outputs="@(_ReferenceRelatedPaths->'$(OutputPath)%(Filename)%(Extension)')"
  DependsOnTargets="ResolveReferences"
  >
  <Copy
      SourceFiles="@(_ReferenceRelatedPaths)"
      DestinationFiles="@(_ReferenceRelatedPaths->'$(OutputPath)%(Filename)%(Extension)')"
      UseHardlinksIfPossible="true"
      />
</Target>

<Target Name="CopyReferencedAssemblies"
    Inputs="@(_AssembliesToCopy)"
    Outputs="@(_AssembliesToCopy->'$(OutputPath)%(Filename)%(Extension)')"
    DependsOnTargets="ResolveReferences"
    >
  <Copy
      SourceFiles="@(_AssembliesToCopy)"
      DestinationFiles="@(_AssembliesToCopy->'$(OutputPath)%(Filename)%(Extension)')"
      UseHardlinksIfPossible="true"
      />
</Target>
当文件是最新的时,它不会做任何事情:

CopyReferencedAssemblies:
Skipping target "CopyReferencedAssemblies" because all output files are up-to-date with respect to the input files.
CopyFilesRelatedToReferencedAssemblies:
Skipping target "CopyFilesRelatedToReferencedAssemblies" because all output files are up-to-date with respect to the input files.
问题: 我当前解决方案的问题是,我必须复制项目参考中包含的HintPath提供的值:

<Reference Include="Moq">
  <HintPath>..\..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath>
  <Private>False</Private>
</Reference>
这不管用吗:

<Target Name="MyTarget">
  <ItemGroup>
    <_AssembliesToCopy Include="%(Reference.HintPath)" />
  </ItemGroup>
  ...then the Copy task using @(_AssembliesToCopy)
</Target>

…然后使用@(_AssembliesToCopy)复制任务
这不起作用:

<Target Name="MyTarget">
  <ItemGroup>
    <_AssembliesToCopy Include="%(Reference.HintPath)" />
  </ItemGroup>
  ...then the Copy task using @(_AssembliesToCopy)
</Target>

…然后使用@(_AssembliesToCopy)复制任务

%(Reference.HintPath)
不会被解释,它最终是一个字符串文本:(.它应该是1.它不应该是Ludwo建议的,它只会将引用项中的“Include”值复制到新的项数组中,而根本不是想要的值。2.我刚刚尝试了这一点和%(Reference.HintPath)已解释。请仔细检查您的拼写和语法,或将您的确切代码粘贴到您的问题中,我将帮助您进行诊断。请更仔细地查看您的问题(为我没有这么做而感到羞耻),您在目标中定义了
ItemGroup
,而我的目标是全局的。我想这就是问题所在?现在正在调查。详细信息:我最初使用的是全局
ItemGroup
,但它没有得到扩展。我想完成的主要任务之一是让它支持增量构建,这样它就不会复制程序集和相关文件。要修复此问题,我删除了全局
项目组
引用,然后向我的
AfterBuildDependsOn
添加了一个额外的依赖项,该依赖项在创建动态
项目组
的复制目标之前运行,如您所示。完成后,一切都运行良好。谢谢!
%(Reference.HintPath)
不被解释,它以字符串文字结尾:(.它应该是1.它不应该是Ludwo建议的,它只会将引用项中的“Include”值复制到新的项数组中,而不是想要的值。2.我刚刚尝试了这个和%(Reference.HintPath)已解释。请仔细检查您的拼写和语法,或将您的确切代码粘贴到您的问题中,我将帮助您进行诊断。请更仔细地查看您的问题(为我没有这么做而感到羞耻),您在目标中定义了
ItemGroup
,而我的目标是全局的。我想这就是问题所在?现在正在调查。详细信息:我最初使用的是全局
ItemGroup
,但它没有得到扩展。我想完成的主要任务之一是让它支持增量构建,这样它就不会复制程序集和相关文件。为了修复,我删除了全局
ItemGroup
引用,然后向我的
AfterBuildDependsOn
添加了一个额外的依赖项,该依赖项在创建动态
ItemGroup
的复制目标之前运行,正如您所演示的。完成后,一切都运行良好。谢谢!
<_AssembliesToCopy Include="{{Change %(Reference.HintPath) to file ref}}"/>
<Target Name="MyTarget">
  <ItemGroup>
    <_AssembliesToCopy Include="%(Reference.HintPath)" />
  </ItemGroup>
  ...then the Copy task using @(_AssembliesToCopy)
</Target>