撰写桌面项目:如何在不提交的情况下包含 API 密钥(或其他机密)?

Compose Desktop projects: how to include API keys (or other secrets) without committing?

Compose Desktop 项目中,我们如何在不提交的情况下管理密钥?

在Android个项目中,Gradle有buildConfigField()resValue()函数。它们会在编译时生成一个BuildConfig.java,我们可以在运行时使用这些值。

例如,在一个Android项目中,首先,我们创建两个环境变量——RELEASE_API_KEYSTAGING_API_KEY(可以是本地计算机,也可以是CI/CD环境)。

然后在 build.gradle 文件中我们可以说:

android {
   buildTypes {
     release {
       buildConfigField("String", "API_KEY", "\"${System.getenv('RELEASE_API_KEY')}\"")
     }
     staging {
       buildConfigField("String", "API_KEY", "\"{System.getenv('STAGING_API_KEY')}\"")
     }
   }
}

..在 Kotlin 代码中我们可以使用:

val apiManager = ApiManager( BuildConfig.API_KEY )

Compose Desktop 项目中是否有类似的方法,以便:

  1. 我不必将秘密提交到源存储库?
  2. 我可以在 CI/CD 环境中轻松配置机密吗?

所以有一些 Gradle 插件是为了解决这样的问题而构建的 - 将构建时间常量注入我们的运行时代码。这是 Google 搜索中出现的那个:

https://github.com/gmazzo/gradle-buildconfig-plugin

这是我将配置中的 c 换成 k 时出现的问题(你知道这些 Kotlin 开发人员无法抗拒吧?)

https://github.com/yshrsmz/BuildKonfig

当然 - 如果你不想像这样乱用 gradle 插件,简单的解决方案是用你的开发代码创建一个文件,其中相同的常量被取消或为空字符串,或引用一个被忽略的文件来获取值,然后使用 bash 覆盖 CI 中的文件,用你想要的替换所有常量。当你无法访问 gradle 时,这种方法非常有用,比如在 js 项目中:

#!/usr/bin/env bash

AWS_FILE=<your aws credentials file here>
if [ -f "$AWS_FILE" ]; then
    echo "Injecting the AWS Credentials"
    echo "export const AWS_CREDENTIALS = {
    clientId: \"$AWS_CLIENT_ID\",
    secret: \"$AWS_CLIENT_SECRET\"}" > $AWS_FILE
else
    echo "$AWS_FILE doesn't exist."
    exit 1
fi