使用CopyLocal = False管理VS2010引用

时间:2011-07-20 11:46:15

标签: visual-studio-2010 msbuild reference

我正在努力改进我们的构建过程,为此我一直在寻找关闭本地复制并将整个解决方案构建到一个公共\ bin目录。

但是,将不再复制的引用添加到bin目录中的最佳做法是什么?我不想在其中一个实际的实现项目中执行此操作,因为其中许多项目使用相同的引用组件,这意味着后期构建步骤的增加。

我知道我可以创建一个自定义的msbuild文件但是那需要在visual studio之外手动运行(我想)?这似乎是摩擦。有没有办法可以创建一个msbuild项目,然后将其作为我的解决方案的一部分。

或者最好只是在我的解决方案构建之外管理这个并且有一个copy_references.bat文件,dev必须运行一次以设置他们的环境,将它们放入/ bin / debug和/ bin / release目录中?这似乎有点脆弱,但比直接检查/ bin和文件到svn更好。

我有一个想法是创建一个空的c#组件项目并添加对它的引用,并打开copy local。如果这是所有其他项目的依赖,它将管理复制。

接下来的问题是如何使用nuget引用来管理它?我的偏好是不检查对svn的引用,但告诉nu​​get抓住它们。所以这也需要是一个构建步骤,但同样需要在解决方案级别。

其他信息

有关我为何要评估此方法的更多背景信息,请查看此处:

http://www.ndepend.com/Res%5CNDependWhiteBook_Assembly.pdf

目标是通过停止所有这些冗余副本来大大加快编译时间。如果它的工作原理也可能不需要手动工作,依赖性评估不起作用。导致必须将引用程序集的依赖项拉入顶级项目,以确保它们最终位于bin文件夹中。

我想在某些方面,关闭复制本地的愿望是ms构建过程在跟踪依赖关系和评估复制事物的需要时效率低下的工件。

1 个答案:

答案 0 :(得分:2)

您可以全局覆盖$(OutDir)属性并保持启用CopyLocal。由于每个项目都复制到相同的$(OutDir),因此不会出现过多的重复。这很简单。

更多涉及的内容,您还可以创建一个共享导入文件,该文件连接到标准版本并执行自定义的构建后部署。例如,

<Target Name="Deploy"
   DependsOnTargets="Deploy)"
   AfterTargets="Build">

   ... copy all output files ...
   e.g. use wildcards $(OutDir)\*.dll
   e.g. $(OutDir)\$(TargetName)$(TargetExt)
   e.g. copy referenced assemblies and copy, see below
</Target>

要获取引用,可以调用ResovleAssemblyReferences目标并使用返回,或创建自己的目标以获取特定集合,如此处的答案所示, Return the ReferenceCopyLocalPaths from <MSBuild> task 如果您可以在包含元数据的项目数组中声明自己的“规则”,那么它可以相当复杂,但可以轻松配置。