3

Похоже, что VS2010 и MSBuild 4.0 VisualStudio и MSBuild могут разрешать и создавать ссылки на проекты, которые не находятся в пределах решения.VS2010/MSBuild 4.0 создание внешних проектов

Приведем пример, чтобы быть более конкретным. Создайте решение под названием Решение1 с проектом C# с именем A и еще один проект под названием B. В проект B, добавить ссылку на проект A. Теперь создайте новое решение под названием Solution2 и нажмите «Добавить существующий проект» и выберите Проект B. Существует предупреждение, которое можно увидеть в обозревателе решений и в списке предупреждений.

Хитрость в том, что даже при наличии «предупреждения как ошибки» мы можем построить Solution2.sln. Фактически, проект A находится и построен Visual Studio или MSBuild. Убедимся в этом, открыв командную строку/VS2012 VS2010 и выполнить следующие команды:

msbuild <dirPathToSolution1> Solution1.sln /t:clean **cleaning up solution1 with project A" 
msbuild <dirPathToSolution1> Solution2.sln /t:build 

ProjectA эффективно построен и хуже: предупреждение упоминалось выше, даже не поднял там. С предыдущими версиями Visual Studio такая ситуация не может произойти (я протестировал ее с помощью msbuild 3.5 и VS2008).

Однако в нашей ситуации мы хотели бы предотвратить такие вещи. В самом деле, у нас есть большой исходный репозиторий с несколькими решениями и многими коммиттерами. Мы реорганизуем наши зависимости, направленные на окончательное извлечение небольших репозиториев. Между тем, мы не хотим, чтобы разработчики добавляли скрытые зависимости проекта, не видя этого. Мы хотели бы разрешить только ссылки на проекты «внутри» решения, оставив другие зависимости от ссылок на сборку.

Таким образом, возникает вопрос: «Есть ли способ предотвратить такое решение, такое как Solution2 для сборки?». В идеале, он не должен компилироваться как с VS2012, так и с MSBuild. Однако решение, связанное только с командной строкой MSBuild, было бы выполнено благодаря нашей Continuous Integration.

+0

Возможный дубликат [Почему «Указанный компонент« X »не найден». считается предупреждением?] (http://stackoverflow.com/questions/166831/why-is-the-referenced-component-x-could-not-be-found-considered-a-warning) – stijn

ответ

1

Редактировать Я проверил Microsoft.Common.Targets и нет никакого способа добиться того, чего вы хотите. Будут построены либо ссылки на проекты, либо нет (на это, например, влияет флаг BuildProjectReferences моего первоначального ответа). Невозможно построить их выборочно в зависимости от того, в каком решении они находятся, если я не пропущу что-то, что связано главным образом с тем, что ссылки на проект устанавливаются на уровне проекта, а не на уровне решения: в файле проекта есть MsBuild ItemGroup с именем ProjectReferences и который используется. (На самом деле это имеет смысл: если вы попросите MsBuild построить projectB.csproj, а B говорит, что он ссылается на A, тогда никакое решение не вступит в игру, и вы можете ожидать, что он будет строить A, ведь вы ссылаетесь на него).

Теперь, насколько я понимаю, вы хотите запретить ссылки на каталоги, структура которых представлена ​​решениями. Если это так, и вы действительно нуждаетесь в этом, вы, вероятно, может уйти с инструментом, который анализирует журнал MSBuild и выглядит для линий, как

Project "somedir\projectB.csproj" (2) is building "someOtherDir\projectA.csproj" (3) ... 

затем извлечь информацию каталога из него и сделать инструмент поднять если они не совпадают. Затем включите инструмент на своем сервере CI и подайте его в файлы журнала msbuild.

оригинальный ответ Пробуйте с /p:BuildProjectReferences=false в командной строке. Как видно из названия, он отключит построение ссылочных проектов. При создании решения 1 это не должно быть проблемой, поскольку projectA будет построен так или иначе, как в решении. Однако при создании решения 2 он не будет строить projectA, и вы получите ошибку сборки.

+0

Мы проверили этот msbuild вариант. Однако это не то, что мы хотим. В самом деле, мы хотим сохранить разрешение ссылок на проект в рамках решения, исключая обходные пути с использованием заказов на строительство. Например, решение с двумя проектами (в этом порядке) ClassLibrary1 и ClassLibrary2, то если ClassLibrary1 ссылается на ClassLibrary2, решение не будет строить с помощью/p: BuildProjectReferences = false. –

+0

* Теперь, насколько я понимаю, ... представлены решениями *. Вы догадываетесь, что это более или менее то, что мы хотели бы предотвратить, прежде чем мы установим более чистое разделение. Мы также проверили MSBuild и ничего не нашли для этой ситуации. Может быть, мы будем внедрять что-то, чтобы выполнить эту работу ... Однако VisualStudio поднимает предупреждение, что означает, что есть где-то в Visual check для этой ситуации, возможно, есть способ повторного использования этого ... –

+0

Вещь в VS-загрузке проект выполняется с использованием классов, найденных в пространстве имен Microsoft.Build.Evaluation (или что-то вроде этого, не знаю наизусть), поэтому это не предупреждение сборки от MsBuild. Если вам нужно это предупреждение, вам придется вручную его вручную. – stijn

Смежные вопросы