Как заставить пользовательскую задачу msbuild работать правильно? - PullRequest
1 голос
/ 03 мая 2009

У меня есть решение VS 2008 с 2 проектами. Проект A встраивается в сборку, которая используется проектом B (проект MVC). Я создал пользовательскую задачу в проекте A, которую я вызываю при создании проекта B.

Я столкнулся с двумя проблемами:

  1. Если мое свойство AssemblyFile указывает на каталог bin проекта A, все работает хорошо. Но когда я хочу очистить Project B, он всегда выдает ошибку, что сборка Project A не может быть доступна, потому что она используется другим процессом (оказывается devenv.exe), и удаление завершается неудачно.
  2. Если мое свойство AssemblyFile указывает на каталог bin проекта B, сборка завершается неудачно, говоря, что она не может загрузить или найти сборку проекта А. Я трижды проверил путь, имя файла, прописные / строчные буквы, орфографию, а также проверил, что сборка Project A действительно там, когда сборка не удалась.

Так что же не так в сценарии 1 и 2. Или куда я должен указывать AssemblyFile? В противном случае, есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 04 мая 2009

Существует несколько способов определения ссылок на проект.

  1. Ссылка на проект - Это более комплексный подход, поскольку VS определит для вас порядок сборки. Таким образом, когда вы строите проект B, VS определяет, что проект B зависит от проекта A, и сначала создаст проект A и будет использовать выходную DLL A из своего выходного местоположения. Недостаток использования ссылок на проекты состоит в том, что, когда вы хотите включить свой проект B в другое решение, вы должны также включить проект A.

  2. Ссылка на сборку - Вы также можете определить ссылку на сборку. Похоже, это метод, который вы используете. В этом случае, когда вы устанавливаете ссылку на файл из Проекта B на ProjA.dll в / bin Проекта A, Visual Studio не знает, что она должна сначала построить Проект A для создания ProjA.dll. Вы можете указать Visual Studio сначала построить проект A, установив соответствующие «Зависимости проекта».

Для этого загрузите в решение как ProjA, так и ProjB. Предполагая, что у вас уже есть ссылка на сборку, определенная в сценарии 2, щелкните правой кнопкой мыши проект B и выберите «Зависимости проекта ...». Здесь вам просто нужно поставить галочку рядом с проектом А в списке. Теперь, когда вы очищаете и создаете решение, VS знает, какой порядок построения ваших проектов.

Также важно отметить, что «Порядок сборки» и «Зависимости проекта» определяются на уровне решения. Таким образом, если вы создаете другое решение с зависимыми проектами, определенными как ссылки на файлы, вам придется установить порядок сборки для этого нового решения.

1 голос
/ 04 мая 2009

Если вы хотите построить два проекта независимо друг от друга, то вы не можете ссылаться на сборку «A» из выходного каталога VS, в котором она собирается ...

Как бы я справился с этой ситуацией:

Создайте папку зависимостей на верхнем уровне папки моих проектов в транке .. т.е.:

  • ~ / багажника / зависимости
  • ~ / багажник / проекты
  • ~ / багажник / проекты / Projecta
  • ~ / багажник / проекты / projectB

Затем в задании на сборку для projectA скопируйте сборку в папку ~ / trunk / dependencies, как только она будет собрана.

В projectB, ссылка на эту сборку в папке ~ / dependencies (поэтому вы создаете файл .refresh)

Это позволит вам очистить projectB по желанию, и сборка «А» будет отключена в любое время.


Для CI мы используем JetBrains TeamCity и создаем артефакты для наших сборок, тогда задачи сборки ссылаются на эти артефакты по мере необходимости.

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