【问题标题】:Conditional compilation with automated builds in Visual Studio在 Visual Studio 中使用自动构建进行条件编译
【发布时间】:2009-03-23 02:42:39
【问题描述】:

这是我想要做的:

  • 单个构建脚本
  • 该脚本从同一个 Visual Studio 项目构建两个可执行文件。
  • 第一个编译的 .exe 有少量代码禁用
  • 另一个编译的 .exe 已启用

我一直在阅读 conditional compilation,它满足了我在启用/禁用代码块方面的需求。

我只是不知道如何从构建脚本使用 msbuild 控制条件编译。

有没有办法从构建脚本或其他方式操作条件编译变量来完成我想要做的事情?

【问题讨论】:

    标签: vb.net visual-studio-2005 msbuild build-automation


    【解决方案1】:

    在您的项目文件中使用构建配置。在基于配置可选包含的 PropertyGroup 中设置参数。然后配置还可以定义两个不同版本的程序集的输出路径。

    对于需要删除一些代码的版本,请使用包含 PropertyGroup 的配置。

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'CompiledOutDebug|AnyCPU' ">
       <DefineConstants>$(DefineConstants);MY_CONDITIONAL_COMPILATION_CONSTANT</DefineConstants>
    </PropertyGroup>
    

    然后使用MSBuild脚本调用项目MSBuild脚本两次,并使用MSBuild任务的Properties属性来指定要构建的配置:

    <Target Name="Build">
        <MSBuild Projects="MyProject.csproj;" 
                 Targets="Build" 
                 Properties="Configuration=Release" />
        <MSBuild Projects="MyProject.csproj"
                 Targets="Build"
                 Properties="Configuration=CompiledOutDebug" />
      </Target>
    

    【讨论】:

    • Hamish,你的条件不太正确,但我还是投了赞成票,因为你的概念正确,可重复构建。
    • 谢谢。这是为了说明这个概念。不过我会再看一遍。
    • 看起来您也可以在 Visual Studio 中执行此操作。 msdn.microsoft.com/en-us/library/kwybya3w(VS.80).aspx
    • 我更喜欢单独的 MSBuild 文件,因为我可以在本地或持续集成服务器上运行它。我们试图将所有内容都保留在项目文件中,但它最终变得很复杂,VS 偶尔会决定为您重写其中的部分内容。
    • 您不需要单独的目标。您可以对一个目标执行相同的操作并指定 DefineConstant 属性。
    【解决方案2】:

    Hamish 打败了我。

    这是使用相同概念的替代解决方案:

    在命令行:

    msbuild -t:Clean
    msbuild
    CopyOutputDirForWithoutDefine.cmd
    msbuild -t:Clean
    msbuild -property:DefineConstants=MY_CONDITIONAL_COMPILE_CONSTANT
    CopyOutputDirForWithDefine.cmd
    

    第一个和第三个 'msbuild -t:Clean' 确保您没有留下以前构建的粪便。第二个“msbuild”构建没有条件定义,而第四个构建有条件定义。

    如果以上只是一些拍摄项目,那么一个批处理文件可能就足够了。我建议学习一点 MSBuild 并像 Hamish 所做的那样在 MSBuild 文件中实际编写所有内容。

    【讨论】:

    • 请注意,VB 使用逗号 (?) 作为 DefineConstants 分隔符,而 C# 更宽容(分号、逗号、...)
    【解决方案3】:

    如果您不想为两个编译创建单独的目标,可以通过在第二次调用构建时在 DefineConstants 属性中指定条件定义来实现:

    <Target Name="Build">
        <MSBuild Projects="MyProject.csproj;"
                 Targets="Build"
                 Properties="Configuration=Debug" />
        <MSBuild Projects="MyProject.csproj"
                 Targets="Build"
                 Properties="Configuration=Debug;
                             AssemblyName=$(AssemblyName)_Conditional;
                             DefineConstants=$(DefineConstants);CONDITIONAL_DEFINE" />
    </Target>
    

    请注意,如果您这样做,您还需要覆盖 AssemblyName,否则您的第二个构建可能会从第一个构建中选择中间文件。

    您还应该查看 MSDN 上的 MSBuild task 文档,那里有一些有趣的花絮。

    【讨论】:

    • 不错。没看出来。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2012-03-19
    相关资源
    最近更新 更多