Delphi 从命令行生成时如何修改/替换选项集文件?

Delphi 从命令行生成时如何修改/替换选项集文件?,delphi,deployment,delphi-2009,Delphi,Deployment,Delphi 2009,我使用以下命令从批处理文件构建包: msbuild ..\lib\Package.dproj /target:Build /p:config=%1 包的设置取决于选项集: <Import Project="..\optionsets\COND_Defined.optset" Condition="'$(Base)'!='' And Exists('..\optionsets\COND_Defined.optset')"/> 此选项集定义了我的许多包所依赖的条件符号。该文件如下

我使用以下命令从批处理文件构建包:

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>

条件$(DCC_定义)
Delphi.Personality.12
视起效
12
现在我需要两个构建:一个定义了条件,另一个没有。我的攻击向量将是选项集文件。我对该做什么有一些想法:

  • 编写一个修改选项集文件的程序,在批生成之前运行此程序
  • 修改项目文件并修改选项集路径以包含环境变量,然后在不同位置具有不同的选项集

但是在开始重新发明轮子之前,我想问一下你将如何处理这个任务?可能已经有方法支持这种情况(比如某些命令行开关,我可以在Delphi或batch file magic中配置的东西)。

我的方法是定义多个构建配置,然后在构建时使用
/p:config=XXX
选择适当的配置。在IDE中也可以很好地工作,因为您可以双击项目管理器中的构建配置来激活它

我个人在执行此操作时使用构建配置的继承,这样我就不必重复自己的操作。例如,我有一个名为
Debug DCUs
的构建配置,它继承了
Debug
配置,只需将
Debug DCUs
选项更改为
True

为了帮助解释我的意思,以下是构建配置树在我的项目中的样子:

调试DCU
配置通过此选项集实现:

<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>
msbuild /t:Build /p:Config=Release /p:OptSet=myoptset.optset myproject.dproj

真的
Delphi.Personality.12
视起效
12
现在,我确信您可以通过使用
/p:DCC_Define=XXX
来实现这一点,但我认为使用构建配置更为简洁,这样您就可以确保IDE中获得的内容与从命令行构建中获得的内容相同


我不推荐你的要点清单中的任何一种方法。这些方法在我看来非常脆弱。

一个解决办法是临时重命名.optset文件;这将有效地禁用它,因为无法找到引用的文件。可以在调用msbuild之前从批处理文件执行此操作。这只适用于用作参考的选项集,就像您的情况一样

另一个选项是在
.dproj
文件中手动插入
指令:

<Import Condition="Exists('$(OptSet)')" Project="$(OptSet)"/>
如果不设置
OptSet
属性,将不会导入选项集:

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

选项集似乎是在配置层次结构中更高一级的好方法,因为我可以在一个地方更改所有依赖包的配置。但是,与使用配置管理器相比,它可能没有那么大的区别。构建配置对于QA和可重复性来说是非常棒的。我爱他们!我仍然不明白如何完美地使用它们,但那是另一回事!!这是否意味着您不直接在构建配置(例如调试)中修改任何内容,而是在作为参考添加的选项集中定义设置?那么构建配置构建层次结构,选项集携带设置?是的,这是正确的。这样我就可以在我所有的项目中共享我的选项集。这就一次性解决了项目设置不一致的问题!我真的很喜欢!