我正在努力改进我们的构建过程,为此我一直在寻找关闭本地复制并将整个解决方案构建到一个公共\ bin目录。
但是,将不再复制的引用添加到bin目录中的最佳做法是什么?我不想在其中一个实际的实现项目中执行此操作,因为其中许多项目使用相同的引用组件,这意味着后期构建步骤的增加。
我知道我可以创建一个自定义的msbuild文件但是那需要在visual studio之外手动运行(我想)?这似乎是摩擦。有没有办法可以创建一个msbuild项目,然后将其作为我的解决方案的一部分。
或者最好只是在我的解决方案构建之外管理这个并且有一个copy_references.bat文件,dev必须运行一次以设置他们的环境,将它们放入/ bin / debug和/ bin / release目录中?这似乎有点脆弱,但比直接检查/ bin和文件到svn更好。
我有一个想法是创建一个空的c#组件项目并添加对它的引用,并打开copy local。如果这是所有其他项目的依赖,它将管理复制。
接下来的问题是如何使用nuget引用来管理它?我的偏好是不检查对svn的引用,但告诉nuget抓住它们。所以这也需要是一个构建步骤,但同样需要在解决方案级别。
其他信息
有关我为何要评估此方法的更多背景信息,请查看此处:
http://www.ndepend.com/Res%5CNDependWhiteBook_Assembly.pdf
目标是通过停止所有这些冗余副本来大大加快编译时间。如果它的工作原理也可能不需要手动工作,依赖性评估不起作用。导致必须将引用程序集的依赖项拉入顶级项目,以确保它们最终位于bin文件夹中。
我想在某些方面,关闭复制本地的愿望是ms构建过程在跟踪依赖关系和评估复制事物的需要时效率低下的工件。
答案 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 如果您可以在包含元数据的项目数组中声明自己的“规则”,那么它可以相当复杂,但可以轻松配置。