Управление ссылками VS2010 с помощью CopyLocal = False - PullRequest
2 голосов
/ 20 июля 2011

Я пытаюсь улучшить наш процесс сборки, и с этой целью я пытался отключить локальное копирование и собрать целое решение в общем каталоге \ bin.

Что, однако, является наилучшей практикой для получения больше не скопированных ссылок в каталог bin? Я не хочу делать это в одном из реальных проектов реализации, так как многие из них используют одни и те же компоненты, на которые ссылаются, и это будет означать увеличение количества шагов после сборки.

Я знаю, что мог бы создать собственный файл msbuild, но тогда его нужно было бы запускать вручную за пределами Visual Studio (я думаю)? что похоже на трение. Есть ли способ, например, создать проект msbuild, а затем использовать его как часть моего решения.

Или лучше просто управлять этим вне моей сборки решения и иметь файл copy_references.bat, который разработчик должен запустить один раз, чтобы настроить свою среду и получить их в каталогах / bin / debug и / bin / release? Это кажется немного хрупким, но лучше, чем проверка / bin и файлов напрямую в svn.

Одна идея, которая у меня возникла, - создать пустой проект компонента c # и добавить к нему ссылки с включенным копированием local. Если бы тогда это стало зависимостью от всех других проектов, оно бы управляло копированием.

Следующий вопрос, как это сделать с помощью ссылок Nuget? Я предпочитаю не проверять ссылки в svn, а сказать nuget, чтобы получить их. Так что это также должен быть этап сборки, но опять же на уровне решения.

Дополнительная информация

Для получения дополнительной информации о том, почему я оцениваю этот подход, посмотрите здесь:

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

Цель - значительно сократить время компиляции, остановив все эти избыточные копии. Побочные выгоды, если это работает, могут заключаться в том, что нет необходимости вручную обходить временную оценку зависимости, которая не работает. Вызывая необходимость вытягивать зависимости ссылочных сборок в ваш проект верхнего уровня, чтобы они оказались в папке bin.

Я полагаю, что в некоторых случаях желание отключить локальное копирование является артефактом неэффективности процесса компоновки ms как при трассировке зависимостей, так и при оценке необходимости копирования.

1 Ответ

2 голосов
/ 20 июля 2011

Вы можете переопределить свойство $ (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 и использовать Returns, или создать свою собственную цель, чтобы получить определенную коллекцию, как показано в ответе здесь, Возвращает ReferenceCopyLocalPaths из задачи Это может быть довольно сложным, но легко настраиваемым, если вы можете объявить свои собственные «правила» в массиве элементов с метаданными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...