Как "избавиться" от $ (SolutionDir) при создании проекта Visual Studio извне Visual Studio
Я хочу построить .vcxproj через MSBuild извне Visual Studio. Проблема в том, что в файле .vcxproj есть много вхождений $ (SolutionDir), которые, по-видимому, корректно устанавливаются только при загрузке решения.
Когда я заменяю $ (SolutionDir) на фактический абсолютный путь, это работает. Но другие люди на других машинах работают с тем же файлом проекта, так что это не решение.
Есть решение или взлом, чтобы решить эту проблему?
Ответы
Ответ 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