从作为字符串的文件到对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>