3

我正在尝试为 iOS 构建我的颤振应用程序,它有一个我想要保护的谷歌地图密钥,而不是签入源代码控制它需要从 azure 构建,为了实现这一点,我将我的地图密钥存储为一个秘密变量天蓝色并作为本地系统环境变量,我正在使用 Sourcery https://github.com/krzysztofzablocki/Sourcery为我生成一个包含此密钥的类,这一切都有效,但只有我第二次构建,第一次构建总是失败。

所以我正在使用这个命令构建

flutter build ios --flavor dev --verbose

第一次运行会给我错误

 error: Build input file cannot be found:
           '/Users/martin/xxx/xxx/xxx/ios/Runner/Credentials.generated.swift' (in target

“亚军”

然后再次发出相同的命令

** BUILD SUCCEEDED **

这是我的运行脚本,它在编译源代码之前和颤振运行脚本之后调用

运行脚本

这将调用我的脚本,该脚本调用另一个脚本来导出地图 api 密钥并使用 .yml 文件运行 sourcery 命令,因为它的配置继承了脚本,(它还进行一些日志记录)

#!/bin/bash

echo "Generate Credentials Code"
CREDENTIALS_DIR="$SRCROOT/credentials"

# Set credentials if local script for adding environment variables exist
if [ -f "$CREDENTIALS_DIR/add_credentials_to_env.sh" ]; then
  echo "Add credentials to environement"
  source "$CREDENTIALS_DIR/add_credentials_to_env.sh"
  echo "finished running add_credentials_to_env.sh"
fi

echo "RUN SOURCERY"

$SRCROOT/Pods/Sourcery/bin/sourcery --config "$SRCROOT/config.yml" 
echo "FINISHED RUNNING SOURCERY"

for file in "$SRCROOT/Runner"/*; do
  echo "$file"
done

这是我的配置文件

sources:
  - .
project:
  file: Runner.xcodeproj
  target:
    name: Runner
    module: Runner
templates:
  - credentials/Credentials.stencil
output:
  path: ./Runner/
  link:
    project: Runner.xcodeproj
    target: Runner

args:
  mapsApiKey: ${MAPS_API_KEY_IOS}

这会在第一次构建时正确生成我的类,并且似乎已正确添加到目标中(编辑了我的密钥),但只有当我再次运行构建命令时,该应用程序才会编译。

// Generated using Sourcery 1.4.2 — https://github.com/krzysztofzablocki/Sourcery
// DO NOT EDIT
public struct Credentials {
    let mapsApiKey: String
}
public let credentials = Credentials(mapsApiKey: 
"xxxxxxxxxxMY_KEYxxxxxxxxxxx")

有任何想法吗?

xcode 12.5 m1 macbook pro, swift 5

4

2 回答 2

1

看起来你生成文件太晚了。我建议将您的脚本移动到 Aggregate 并将其作为依赖项添加到您的目标

  1. 添加骨料

项目清单

在此处输入图像描述

  1. 将您的脚本移动到“运行脚本”部分

在此处输入图像描述

  1. 添加“PreBuildScriptsRunner”作为应用程序目标的依赖项,确保“依赖项”部分位于所有其他部分之上

在此处输入图像描述

于 2021-06-15T20:22:29.770 回答
0

手动设置环境变量是开发人员必须在自己的机器上做的一件烦人的事情,并且有更好/更常见的设置私钥的方法。在使用环境变量/ bash 几年后,它仍然会导致不容易检测到的问题。您可能想要自动化/记录它,但是您必须考虑开发人员使用zsh,fishbash? 此外,我尽量避免使用 Xcode 构建阶段。

解决方案?(这就是我所拥有的)

为什么不使用 CI(Azure 管道?,我使用 Github 工作流)来编写 Xcode 构建配置文件(不是 Swift 文件)。敏感密钥可能在一个文件中Secrets.xcconfig,该文件作为构建配置添加到您的 Xcode 中。然后,在您Info.plist的应用程序中,您的代码可以加载它们。

创建一个文件,Secrets.xcconfig

SECRET_API_KEY = 12312rfiwhvde.wvascafsf.df325

将它添加到您的 Xcode 项目中,然后添加到项目的构建配置中:

Xcode 项目信息选项卡 > 配置下拉菜单

添加Secrets.xcconfig到您的.gitignore

确保在将文件提交到 repo 之前 git 忽略该文件。您还可以保留Example.Secrets.xcconfig哪些用户可以使用。在自述文件中,告诉用户运行cp Example.Secrets.xcconfig Secrets.xcconfig然后更新其中的值。现在您可以清楚地看到应用程序正在使用哪些键(清楚地在目录中)。作为奖励,您可以将此文件添加到 Xcode 项目中,这样当文件丢失时,它会显示为红色(向用户表明他们确实应该以某种方式获取此文件):

Secrets.xcconfig 的红色字体

在 Info.plist 中,引用变量:

<dict>
    <key>SECRET_API_KEY</key>
    <string>$(SECRET_API_KEY)</string>
</dict>

在您的代码中,加载存储在的变量Info.plist

let key = Environment.infoDictionary["SECRET_API_KEY"] as? String

在您的 CI/Azure 管道中:

echo "SECRET_API_KEY = $SECRET_API_KEY_SAVED_IN_CONTINUOUS_INTEGRATION" >> Secrets.xcconfig

然后你可以只.gitignore使用文件而不是设置环境变量。当您与其他开发人员一起工作时,您只需给他们这个文件,不需要做任何其他事情来在本地构建。


因此,我不是通过解决您的直接问题来回答您的问题,而是为您提供一种更常见/更规范的方式来解决许多开发人员以前遇到过的这个问题。

于 2021-06-19T21:53:15.007 回答