Макросы / переменная среды в файлах .sln и .vcproj для Visual Studio

У меня две похожие проблемы:

а) У меня есть решение, которое включает в себя несколько проектов, и я хочу иметь возможность легко переключать местоположение проекта, задав некоторую переменную / макрос среды. В качестве примера этот проект может быть расположен в \ SolutionDir \ Dir1 \ или \ SolutionDir \ Dir2 \ Итак, я хочу указать, что он должен находиться в \ SolutionDir \ $ (Var), и просто установить переменную.

Есть ли способ сделать это в Visual Studio?

В настоящее время я знаю только два решения - отредактируйте файл .sln вручную / программно, чтобы найти этот проект и установить правильный путь.

Мне не удалось использовать переменную среды в файле .sln.

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

Что-то вроде \ ProjectDir \ $ (Var2) \ resource.rc

Я нашел многообещающую информацию на листах свойств, но Visual Studio не расширяет макросы, когда я использую их в теге File в .vcproj.

Спасибо за любые идеи, как решить эту проблему.

С уважением, Виктор


person Community    schedule 08.05.2009    source источник
comment
интересный. Но я не могу понять, зачем тебе это нужно. Вероятно, есть другой способ решить проблему, которую вы пытаетесь решить.   -  person Tim    schedule 08.05.2009
comment
Я хочу настроить проект таким образом, чтобы его можно было легко переключать между фирменными версиями продукта для разных OEM-производителей.   -  person    schedule 12.05.2009


Ответы (6)


Просто используйте переменную окружения в соответствующем поле:

OutputDirectory="$(MyEnvVariableName)\Bin"

Один из приемов заключается в том, что вам нужно перезапускать среду разработки Visual Studio каждый раз, когда вы меняете переменную.

Именно об этом есть статья MSDN: Как: использовать переменные среды в сборке < / а>

person Rom    schedule 14.07.2009

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

Я нашел способ сделать это, и он отлично работает для меня (с Visual Studio 2005): - отредактируйте файл .sln с помощью текстового редактора и используйте переменные среды со следующим синтаксисом% MyEnvironmentVariable% - отредактируйте файлы .vcproj и замените путь к нужным файлам с некоторыми переменными со следующим синтаксисом $ (MyEnvironmentVariable).

Надеюсь, это поможет ... Кирилл

person Community    schedule 26.05.2009
comment
Это именно то, что я искал, не знал, что .sln использует синтаксис% VAR%, я использовал $ (VAR), который работает в .scproj. Спасибо! - person watbywbarif; 30.05.2012
comment
Имейте в виду, что введение переменных в файл .sln означает, что они не могут использоваться с MSBuild. См. См. Раздел connect. microsoft.com/VisualStudio/feedback/details/690318/ - person cowlinator; 30.11.2017
comment
Ссылка @cowlinator мертва, но проблема остается, см. эту проблему - person BNT; 26.11.2018

Лучший способ достичь того, что вы описали в б), - использовать листы свойств. Также ознакомьтесь с этим очень аналогичным вопросом.

Я нашел многообещающую информацию на листах свойств, но Visual Studio не расширяет макросы, когда я использую их в теге File в .vcproj.

Я не уверен, какую версию VS вы используете. VS2008 позволяет вам определить, например, каталог include следующим образом: «$ (OpenCVInclude) \ cxcore \ include». Я пользуюсь этим все время. OpenCVInclude - это макрос, определенный на странице свойств.

Что касается вопроса а), я думаю, что не существует "чистого" способа делать то, что вы хотите. В качестве альтернативы вы можете использовать диспетчер конфигурации:

  • Включите в решение все проекты.
  • Назовите проект по-другому, например на основе OEM.
  • Для каждого проекта определите конфигурации выпуска и отладки в решении.
  • В «Сборка-> Диспетчер конфигураций» вы можете установить или снять флажок в столбце «Сборка» для каждой конфигурации. Отметьте «build» для соответствующего проекта.
person Dani van der Meer    schedule 26.05.2009

Я не уверен, что вы создаете только проекты на C ++ или вы также создаете проекты на C # \ VB, но одна из замечательных особенностей Visual Studio заключается в том, что все проекты на самом деле являются просто проектами MSBuild. Если вы редактируете проект в текстовом редакторе, вы увидите, что в конце проекта он импортирует файл .targets. Если вы отследите и найдете отслеживание импорта, вы обнаружите, что почти все проекты VS импортируют Microsoft.Common.Targets. Microsoft.Common.Targets импортирует Custom.Before.Microsoft.Common.Targets. Используя этот импорт, вы можете импортировать свой собственный файл целей с вашими собственными пользовательскими действиями.

У меня, например, есть целевой файл, у которого есть общее свойство, определенное для всех проектов в решении, и настраиваемое событие пост-сборки, которое обрабатывается в конце каждой сборки проекта.

Используя этот метод расширения и создавая пользовательские конфигурации в решении, помимо стандартного выпуска \ отладки, вы сможете создать настолько сложную конфигурацию сборки, насколько вам нужно.

person mageos    schedule 28.01.2014

(а) Кирилл дает достойное решение того, о чем вы просили. Другой способ - хранить изменяемые настройки в одном месте. Обратите внимание, что это не будет работать для файлов, отличных от msbuild, таких как * .sln и * .vcproj (до VS 2010).

Файлы проекта: ... $ (ChangeableDir) \ foo.cs

Common.targets: ChangeThis ...

Однако я не думаю, что это лучший способ делать что-то. Если различия между тем, что вы создаете, представляют собой большие функциональные возможности, вам следует подумать о создании ветки в вашей системе управления версиями. OTOH, если различия незначительны - например, жестко запрограммированные строки - тогда это приводит к вашему второму вопросу ...

(б) Тип управления ресурсами, который вы описываете, по сути, представляет собой ту же проблему, с которой сталкиваются люди, локализующие свой проект на разные языки. К счастью, с 2005 года в Visual Studio встроена прямая поддержка. Ознакомьтесь с предыдущими вопросами, например: Локализация в Visual Studio 2008 год

person Richard Berg    schedule 06.06.2009

Одно из решений - установить некоторые переменные среды непосредственно перед запуском VS. В наших проектах мы используем командный файл, который выглядит так:

SET ROOT=D:/root
SET COMPILER_ROOT=C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE
start "Microsoft Visual Studio 12.0" /D"%COMPILER_ROOT%\" "%COMPILER_ROOT%/devenv.exe" "%ROOT%\trunk\OurSolution.sln"
person Jacob    schedule 14.07.2021