我有数百个 Google Apps 脚本项目和各种 Bash 脚本,用于使用clasp工具(一个 Node.js 应用程序)管理项目。许多脚本需要clasp pull
先在本地拉取项目,然后再对本地文件执行一些操作,所以我有一个脚本,它遍历本地 clasp 项目文件夹并clasp pull
在每个文件夹上运行。该循环按顺序遍历目录,因此如果拉取一个项目需要 3-4 秒,那么每 100 个项目运行它最终需要 5-6 分钟。
我的目标是能够clasp pull
并行运行命令,使它们同时启动,并且能够知道哪些项目被成功拉取,哪些项目被拉取失败。
给定这样的目录结构:
├── project-1
│ ├── .clasp.json
│ ├── .claspignore
│ ├── _main.js
│ └── appsscript.json
├── project-2
│ ├── .clasp.json
│ ├── .claspignore
│ ├── _main.js
│ └── appsscript.json
├── project-3
│ ├── .clasp.json
│ ├── .claspignore
│ ├── _main.js
│ └── appsscript.json
└── pull_all.sh
这个pull_all.sh
Bash 脚本:
#!/bin/bash
# use Node 14.17.5 to prevent "Error: Looks like you are offline." errors
# (see https://github.com/google/clasp/issues/872)
[ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh"
nvm install 14.17.5
nvm use 14.17.5
find . -name '.clasp.json' |
while read file; do
(
cd "$(dirname "$file")"
project_dir_name="$(basename "$(pwd)")"
echo "Pulling project ($project_dir_name)"
clasp pull
) &
done
运行此脚本时,它会为每个目录输出“Pulling project”行,然后给出 shell 提示,暗示脚本已完成执行。但是在没有用户做任何事情的情况下,3-4 秒后它显示了所有clasp pull
命令的输出(显然是并行运行,因为命令的一些输出是乱序/重叠的),然后挂起,并且没有给出新的外壳提示符。此时我必须按 ctrl+c 来终止脚本。
完整的输出最终看起来像这样:
$ ./pull_all.sh
v14.17.5 is already installed.
Now using node v14.17.5 (npm v6.14.14)
Now using node v14.17.5 (npm v6.14.14)
Pulling project (project-3)
Pulling project (project-2)
Pulling project (project-1)
$
Cloned 2 files.
⠙ Pulling files…└─ appsscript.json
└─ _main.js
Cloned 2 files.
└─ _main.js
└─ appsscript.json
Cloned 2 files.
└─ _main.js
要强制其中一个脚本失败,我可以在任何文件中将其更改scriptId
为无效的脚本 ID 。.clasp.json
在这种情况下,我确实看到了预期的输出:
Could not find script.
Did you provide the correct scriptId?
Are you logged in to the correct account with the script?
...但它仍然与其他输出混合在一起,并且不清楚来自哪个项目。
我怎样才能做到这一点:
- 该脚本在执行脚本期间不会导致出现新的 shell 提示。
- 该脚本输出一行指示每个
clasp pull
操作的成功或失败,由项目的目录名称(.clasp.json
找到文件的位置)引用。 - 奖励:抑制输出,
clasp pull
因此脚本仅显示每个项目的成功或失败结果(由目录名称引用)。
注意:我已经提到clasp pull
了一个示例命令,但一个有效的解决方案将允许我在 bash while 循环中将任何 clasp 命令作为后台进程运行,包括但不限于clasp push
,clasp deploy
等。