我正在尝试动态构建一个在github操作中运行的bash命令。我的步骤如下:
- name: Build PREPROD
run: |
# Generate dart-define values from the preprod.env file
DART_DEFINES_PREPROD="$(scripts/some_script.sh)"
echo $DART_DEFINES_PREPROD
# Build the apk
flutter build apk ${DART_DEFINES_PREPROD}
我在scripts/some_script.sh
中的脚本所做的是转换环境文件的内容,如下所示:
APP_NAME=nameOfMyApp preprod
APP_SUFFIX=.preprod
转换为类似这样的bash参数(这是在我的作业中运行echo $DART_DEFINES_PREPROD
时出现的内容
--dart-define APP_NAME="nameOfMyApp preprod" --dart-define APP_SUFFIX=".preprod"
所以对我来说,它应该运行一个类似的命令
flutter build apk --dart-define APP_NAME="nameOfMyApp preprod" --dart-define APP_SUFFIX=".preprod"
这就是我想要的,当我在我的机器上本地运行它时是有效的。
然而,当上面粘贴的步骤在github Action代理上运行时,结果是以下错误:
Target file "preprod"" not found.
Error: Process completed with exit code 1.
我只是不明白这里发生了什么。我尝试过许多其他语法,它们都会产生相同的结果。
我知道问题来自我的APP_NAME
变量中的空格,因为如果我用其他没有空格的东西替换它,我的步骤就可以正常工作。但由于该值包含在双引号中,我不明白为什么它被解释为两个命令,而不是一个信息。
感谢任何帮助/线索!谢谢
更新1:
好的,所以下面的@";Benjamin W;评论,我阅读了你的链接(谢谢(,我认为我做的是正确的,但它仍然失败了。这是我更新的代码:
# For clarity I removed the .sh script file to show what I'm doing inside of it
dart_defines_args=()
input="scripts/envs/preprod.env"
while IFS='=' read -r name value
do
dart_defines_args+="--dart-define "
dart_defines_args+="$name="$value" "
done < "$input"
echo "${dart_defines_args[@]}"
# Build the apk
flutter build apk ${dart_defines_args[@]}
我也用做了同样的测试
flutter build apk "${dart_defines_args[@]}"
但我最终还是得到了
Target file "--dart-define APP_NAME="nameOfMyApp preprod" --dart-define APP_SUFFIX=".preprod"
或
Target file "preprod"" not found.
取决于我是否在${dart_defines_args[@]}
周围有双引号
我认为问题在于变量展开。
尝试更改:
flutter build apk ${DART_DEFINES_PREPROD}
对于
flutter build apk "${DART_DEFINES_PREPROD}"