从命令行构建时如何修改/替换选项集文件?

时间:2011-11-29 17:36:42

标签: 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')"/>

此选项集定义了我的许多包所依赖的条件符号。该文件如下所示:

<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 个答案:

答案 0 :(得分:3)

我这样做的方法是定义多个构建配置,然后在构建时使用/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 :(得分:1)

一种解决方法是临时重命名.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