MSBuild копирует зависимости, если указан абсолютный путь, и игнорирует, если относительный

Я пытаюсь построить .csproj, который ссылается на некоторые проекты в решении. Эти ссылки отмечены знаком CopyLocal=False. И это желаемое поведение.

Я создаю его для CI с помощью MSBuild, поэтому я установил папку вывода через /p:OutputPath="some output dir". Я также установил /p:SolutionDir="path to the solution" для правильного разрешения некоторых ссылок NuGet.

Проблема в том, что когда я указываю OutputPath с абсолютным путем к выходному каталогу (например, d:\solution\build\buildgroupsubfolder), тогда MSBuild копирует каждую зависимость в выходной каталог, я не знаю, почему он это делает. И если я указываю выходной путь с относительным путем (например, ..\..\..\..\..\build\buildgroupsubfolder), тогда MSBuild правильно обрабатывает CopyLocal=false и не копирует ссылки в выходной каталог.

В нашем решении была некоторая вложенность, проекты разделены на группы, поэтому мы хотим, чтобы они были встроены в подпапки. И я хочу иметь возможность указывать путь сборки относительно базового пути сборки, а не пути самого проекта.

Почему MSBuild игнорирует CopyLocal = false, если указан абсолютный путь, и обрабатывает его правильно, если указан относительный путь?


person Dmitrii Lobanov    schedule 24.09.2012    source источник


Ответы (2)


Ну я покопался дальше. Я обнаружил, что MSBuild ведет себя неправильно, но не думал об этом.

Я думал, что MSBuild ведет себя неправильно, как я описал в своем вопросе. Он действительно обрабатывает CopyLocal=false, как и должно, если я устанавливаю OutputDir на относительный путь. И он плохо себя ведет, если я установил OutputDir на абсолютный путь. Я нашел ответ в MSDN, в котором говорится:

OutputPath - указывает путь к выходному каталогу, относительно каталога проекта, например, «bin \ Debug».

Так что на самом деле MSBuild должен предупреждать меня или даже терпеть неудачу, когда я устанавливаю OutputPath на абсолютный путь, но это не так. Вот почему у меня сложилось впечатление, что абсолютный путь в порядке и есть ошибка с обработкой CopyLocal. Фактическая ошибка заключается в том, что MSBuild работает тогда, когда должен выйти из строя.

person Dmitrii Lobanov    schedule 24.09.2012
comment
Нет, не видел. Я не думаю, что они когда-нибудь решат это исправить. Это не критично. Мы видели гораздо более серьезные ошибки, которые существовали годами. Так что я не думаю, что этот даже заслуживает публикации в Connect :) - person Dmitrii Lobanov; 25.10.2012
comment
Да, но поскольку вы нашли причину своих проблем, их довольно легко решить. Просто измените абсолютный путь на относительный. Рад, что мой вопрос и ответ кому-то помогли :) - person Dmitrii Lobanov; 26.10.2012

У меня была такая же проблема после переключения моего проекта и MSBuild с Visual Studio 2005 на Visual Studio 2010. Однако я хотел избежать использования относительного пути, поэтому вместо этого я переключился на использование нового конвейера веб-публикации (WPP) в .NET. 4.0, добавив в мою командную строку MSBuild следующее:

/p:UseWPP_CopyWebApplication=True /p:PipelineDependsOnBuild=False

Теперь вывод вернулся к нормальному состоянию и по-прежнему можно использовать абсолютный путь в моем каталоге вывода.

person Shawn    schedule 19.04.2013