Подтвердить что ты не робот

Как "избавиться" от $ (SolutionDir) при создании проекта Visual Studio извне Visual Studio

Я хочу построить .vcxproj через MSBuild извне Visual Studio. Проблема в том, что в файле .vcxproj есть много вхождений $ (SolutionDir), которые, по-видимому, корректно устанавливаются только при загрузке решения.

Когда я заменяю $ (SolutionDir) на фактический абсолютный путь, это работает. Но другие люди на других машинах работают с тем же файлом проекта, так что это не решение.

Есть решение или взлом, чтобы решить эту проблему?

4b9b3361

Ответ 1

Вы можете установить переменную, передав аргументы параметра:

/p:SolutionDir=path

Таким образом, вместо редактирования файла решения вы можете создать сценарий сборки, который настраивает среду и, соответственно, выполняет MSBuild, оставляя файл Visual Studio таким же, как для разработки.

Ответ 2

Вы можете использовать относительный путь.

Я не уверен насчет Visual Studio 2010, как в вопросе, но он гарантированно работает с Visual Studio 2012.

Если папка проекта находится прямо под папкой решения, то относительный путь будет ..\\.

Это, кстати, можно сочетать с параметром аргумента из ответа Гранта Томаса.

<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>

Ответ 3

Решение явно передать SolutionDir в качестве аргумента для меня недостаточно.

А именно, если проект, который я хочу построить, имеет зависимости с различными конфигурациями сборки, сборка завершается с ошибкой This project doesn't contain the Configuration and Platform combination of <my target configuration> ошибкой This project doesn't contain the Configuration and Platform combination of <my target configuration>.

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

Поскольку файл решения содержит конфигурации сборки для всех проектов в решении (учитывая некоторую конфигурацию решения), мы хотим использовать это решение для решения этой проблемы. К счастью, MSBuild позволяет нам строить решение и передавать в качестве аргумента конкретный целевой проект, который будет вызывать только сборку этого проекта (вместе с его зависимостями).

msbuild MySolution.sln /t:MyProject