在构建过程中在源中设置 "hard-coded" 标志

Setting a "hard-coded" flag in sources during build process

我正在开发我通过 Gradle(在持续集成服务器上)构建的 (Groovy) 应用程序。该应用程序应编译成两个版本:一个开发版本(包括我只想为自己启用的一些功能)和一个 public 版本(不包括或仅禁用那些 "development features")。

一个解决方案是直接在应用程序的主 class 中设置全局标志之类的东西,例如 static final boolean PUBLIC_RELEASE。然后在我的代码中我可以检查该标志并启用或禁用某个功能。

现在,在我的 Gradle 构建脚本中,我可以检查环境变量(由持续集成服务器设置)。如果设置了该变量,那么我可以在编译源代码之前将标志的当前值设置(即更改)为 truefalse

我相信这种方法会奏效。但是,在构建过程中自己修改源代码感觉不对。另一方面,我认为这是许多软件项目的标准任务。

有什么"best practice"可以满足这个要求吗?

我可以想出三种方法来处理这种情况 - 按照我的方式排序:

  1. 创建一个专用的 properties 文件,该文件在构建期间被过滤并添加到最终的 jar 中。应用程序行为由该文件在运行时决定。基本上这就是这种情况的处理方式,但用户可以直接在 jar 中修改此类文件。

  2. 源代码过滤,提示ReplaceTokens。这似乎是保护应用程序的最佳方式,因为行为是直接 编译 到代码中,但在过滤时也有问题。

  3. 通过在运行时传递系统属性 -D 配置应用程序的行为。有可能应该传递很多这样的属性,因此对于最终用户来说可能会有问题,并且应用程序的配置会被显式公开。