Как передать все «макросы» Visual Studio 2008 в скрипт Python?

[ПРИМЕЧАНИЕ: этот вопрос похож на не то же самое как Вот этот.]

Visual Studio определяет несколько десятков «макросов», которые являются своего рода смоделированными переменными среды (совершенно не связанными с макросами C++), которые содержат информацию о незавершенной сборке. Примеры:

    ConfigurationName  Release
    TargetPath         D:\work\foo\win\Release\foo.exe
    VCInstallDir       C:\ProgramFiles\Microsoft Visual Studio 9.0\VC\

Вот полный набор из 43 встроенных макросов, которые я вижу (ваш может отличаться в зависимости от того, какую версию VS вы используете и какие инструменты вы включили):

    ConfigurationName  IntDir           RootNamespace      TargetFileName
    DevEnvDir          OutDir           SafeInputName      TargetFramework
    FrameworkDir       ParentName       SafeParentName     TargetName
    FrameworkSDKDir    PlatformName     SafeRootNamespace  TargetPath
    FrameworkVersion   ProjectDir       SolutionDir        VCInstallDir
    FxCopDir           ProjectExt       SolutionExt        VSInstallDir
    InputDir           ProjectFileName  SolutionFileName   WebDeployPath
    InputExt           ProjectName      SolutionName       WebDeployRoot
    InputFileName      ProjectPath      SolutionPath       WindowsSdkDir
    InputName          References       TargetDir          WindowsSdkDirIA64
    InputPath          RemoteMachine    TargetExt             

Из них только четыре (FrameworkDir, FrameworkSDKDir, VCInstallDir и VSInstallDir) установлены в среде, используемой для событий сборки.

Как упоминает Брайан, пользовательские макросы могут быть определены, например, для установки в среде, в которой выполняются задачи сборки. Моя проблема связана со встроенными макросами.

Я использую событие Visual Studio Post-Build для запуска скрипта python как части процесса сборки. Я хотел бы передать весь набор макросов (встроенных и определяемых пользователем) в свой сценарий в среде, но я не знаю как. В моем сценарии я могу получить доступ к обычным переменным среды (например, Path, SystemRoot), но НЕ к этим «макросам». Все, что я могу сделать сейчас, это передать их по очереди как именованные параметры, которые я затем обрабатываю в своем скрипте. Например, вот как выглядит моя командная строка после завершения сборки:

    postbuild.py --t = "$(TargetPath)" --c = "$(ConfigurationName)"

Помимо боли в шее, существует ограничение на размер командной строки Post-Build Event, поэтому я не могу передавать десятки макросов с помощью этого метода, даже если бы я хотел, потому что командная строка усечена.

Кто-нибудь знает, есть ли способ передать весь набор имен и значений макросов команде, которая НЕ требует переключения на MSBuild (который, как я считаю, недоступен для встроенного VC++) или какой-либо другой инструмент сборки, похожий на make?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
3 120
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это немного взломано, но может сработать.

Почему бы не вызвать несколько скриптов .py подряд?

Каждый скрипт может передавать небольшое подмножество параметров и значений во временный текстовый файл. Последний сценарий будет читать и обрабатывать временный текстовый файл.

Я согласен с тем, что этот метод полон опасностей и чепухи, но иногда вам нужно просто все вместе взламывать.

Хорошая идея, но есть ограничение на длину командной строки, вызываемой из события сборки VisualStudio. Это что-то вроде 128 или 256 символов. Слишком коротко, чтобы вызывать N сценариев, где N = # макросов (около 43 встроенных функций плюс любые, определенные пользователем).

jwfearn 25.09.2008 04:39

Возможно, вы захотите заглянуть в PropertySheets. Это файлы, содержащие настройки Visual C++, включая пользовательские макросы. Листы могут наследовать от других листов и присоединяться к проектам VC++ с помощью представления PropertyManager View в Visual Studio. Когда вы создаете один из этих листов, появляется интерфейс для создания пользовательских макросов. Когда вы добавляете макрос с помощью этого механизма, есть флажок для установки пользовательского макроса в качестве переменной среды. Мы используем этот тип механизма в нашей системе сборки для быстрой настройки проектов для выполнения нестандартных сборок. Все наши каталоги сборки определены как пользовательские макросы. На самом деле я не проверял, устанавливаются ли переменные среды во внешнем скрипте, вызываемом из пост-сборки. Я обычно использую эти макросы в качестве аргументов командной строки для моих сценариев после сборки, но я ожидаю, что доступ к ним будет, поскольку переменные среды должны работать на вас.

Я использую файлы .vsprops так же, как и вы, для каталогов сборки. Пользовательские переменные передаются нормально (при условии, что PerformEnvironmentSet = "true"), но по какой-то причине почти все встроенные переменные - нет.

jwfearn 27.09.2008 02:40
Ответ принят как подходящий

Насколько я могу судить, метод, описанный в вопросе, является единственным способом передать переменные сборки в скрипт Python.

Может быть, в Visual Studio 2010 есть что-то получше?

Другие вопросы по теме