【问题标题】:Using compiler constants in build events在构建事件中使用编译器常量
【发布时间】:2010-02-27 12:46:54
【问题描述】:

在 Visual Studio - VB.NET 的构建事件中是否可以使用编译器常量? (尤其是在构建后事件中)

场景

如果定义了TEST_EDITION=TRUE,我想在构建后事件期间运行一个可执行文件,所以如果它是FALSE,那么我将运行其他东西。

这可用于为不同版本创建不同的安装程序。

附注在有人建议之前:不,我不想使用 nant、msbuild 或类似的东西

【问题讨论】:

  • 如果你能解释更多关于你想要做什么的信息会有所帮助。
  • 我正在尝试根据编译器常量编写条件构建事件?那不是很清楚吗? - 但我添加了一个示例来澄清这一点。

标签: .net visual-studio post-build-event compiler-constants


【解决方案1】:

是的,$(DefineConstants) 宏可用并且可以在构建事件中进行测试。比如Project + Compile, Advanced Compile Options, Custom constants = Test 可以这样测试:

if /i "$(DefineConstants)" NEQ "TEST" goto skiptest
echo Setting up for test environment
:skiptest

需要以不同方式解析更复杂的自定义常量,例如 Test=TRUE 或复合常量。诚然,我很快就放弃了尝试弄清楚如何使用可怕的FOR command.

【讨论】:

    【解决方案2】:

    您是否尝试过 MsBuild PostEvents?这是 .csproj 的摘录...但同样适用于 vbproj 文件

      <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
           Other similar extension points exist, see Microsoft.Common.targets.
      <Target Name="BeforeBuild">
      </Target>
      <Target Name="AfterBuild">
      </Target>
      -->
      <Target Name="BeforeBuild">
      </Target>
      <Target Name="AfterBuild">
        <Copy SourceFiles="$(OutputPath)$(AssemblyName).dll" DestinationFolder="$(BinariesFolder)" ContinueOnError="true" />
      </Target>
    

    您可以将它与TaskExec 目标一起使用,它允许您运行批处理文件或可执行文件。

    <Target Name="DoSomething">
        <Exec Command="D:\DoSomething.exe"/>
    </Target>
    

    【讨论】:

    • 我不想使用 msbuild,因为它不适合我们当前的构建服务器设置。
    • 我什至不太确定 Msbuild 是否支持这个。
    • 有一个用于 MsBuild 的 ExecTask,它允许您运行批处理文件或可执行文件...我已经更新了我的答案
    【解决方案3】:

    不确定 Visual Basic 的语法,但 C++ 可以使用以下技巧:文件 global_inc.bat 读取为:

    SET PARAMETER=TRUE
    

    这可以由在构建后事件中调用的批处理脚本输入。 C++代码使用文件如下:

    #define PARAMETER const int parameter
    #define SET /**/
    #include "global_inc.bat"
    ;
    #undef PARAMETER
    

    后期构建步骤如下所示:

    call global_inc.bat
    if "%PARAMETER%" == "TRUE" echo True
    

    另一种可能性是预构建步骤生成.vb 文件,以及在构建后步骤中使用的配置文件。

    【讨论】:

    • 我认为这是解决此限制的方法,因为我真的不需要编译任何东西。我只想在构建后事件期间常量为 TRUE 时运行可执行文件。
    • 将示例更改为更接近问题。然而,nobugz 的答案似乎是一个更好的解决方案
    猜你喜欢
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2012-08-25
    • 1970-01-01
    • 2016-01-14
    相关资源
    最近更新 更多