Как изменить / заменить файл набора опций при сборке из командной строки? - PullRequest
4 голосов
/ 29 ноября 2011

Я собираю пакеты из командного файла, используя такие команды, как:

msbuild ..\lib\Package.dproj /target:Build /p:config=%1

Настройки пакетов зависят от набора параметров:

<Import Project="..\optionsets\COND_Defined.optset" Condition="'$(Base)'!='' And Exists('..\optionsets\COND_Defined.optset')"/>

Этот набор опций определяет условный символ, от которого зависят многие мои пакеты. Файл выглядит так:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DCC_Define>CONDITION;$(DCC_Define)</DCC_Define>
    </PropertyGroup>
    <ProjectExtensions>
        <Borland.Personality>Delphi.Personality.12</Borland.Personality>
        <Borland.ProjectType>OptionSet</Borland.ProjectType>
        <BorlandProject>
            <Delphi.Personality/>
        </BorlandProject>
        <ProjectFileVersion>12</ProjectFileVersion>
    </ProjectExtensions>
</Project>

Теперь мне нужно две сборки: одна с заданным условием, а другая без. Мой вектор атаки был бы файлом набора опций. У меня есть несколько идей о том, что делать:

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

Но прежде чем начинать изобретать велосипед, я хотел бы спросить, как бы вы справились с этой задачей? Может быть, уже есть средства, предназначенные для поддержки такого случая (например, некоторые параметры командной строки, вещи, которые я мог бы настроить в Delphi, или магия пакетных файлов).

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

Я подхожу к этому, чтобы определить несколько конфигураций сборки, а затем выбрать подходящую во время сборки с помощью /p:config=XXX. Прекрасно работает и в IDE, потому что вы можете просто дважды щелкнуть конфигурацию сборки в менеджере проектов, чтобы активировать ее.

Я лично использую наследование конфигураций сборки, когда я делаю это, чтобы мне не пришлось повторяться. Например, у меня есть конфигурация сборки с именем Debug DCUs, которая наследуется от конфигурации Debug и просто меняет параметр Debug DCUs на True.

Чтобы объяснить, что я имею в виду, вот как выглядит дерево конфигурации сборки в моем проекте:

enter image description here

Настройка Debug DCUs осуществляется с помощью этого набора параметров:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DCC_DebugDCUs>true</DCC_DebugDCUs>
    </PropertyGroup>
    <ProjectExtensions>
        <Borland.Personality>Delphi.Personality.12</Borland.Personality>
        <Borland.ProjectType>OptionSet</Borland.ProjectType>
        <BorlandProject>
            <Delphi.Personality/>
        </BorlandProject>
        <ProjectFileVersion>12</ProjectFileVersion>
    </ProjectExtensions>
</Project>

Теперь я уверен, что вы могли бы сделать это с помощью /p:DCC_Define=XXX, но я думаю, что использование конфигураций сборки более понятно, так что вы можете быть уверены, что то, что вы получаете, IDE совпадает с тем, что вы получаете сборка командной строки.

Я бы не рекомендовал ни один из подходов в вашем списке. Эти подходы кажутся мне чрезвычайно хрупкими.

1 голос
/ 30 ноября 2011

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

Другой вариант - вручную вставить директиву <Import> в файл .dproj:

<Import Condition="Exists('$(OptSet)')" Project="$(OptSet)"/>

Вы можетезатем установите свойство OptSet из командной строки, которое будет импортировать набор параметров:

msbuild /t:Build /p:Config=Release /p:OptSet=myoptset.optset myproject.dproj

Без установки свойства OptSet набор параметров не будет импортирован:

msbuild /t:Build /p:Config=Release myproject.dproj
...