Vercelの環境変数へローカルの.envからプッシュしたい
tag: vercel
はじめに
pull はできるのに push はできないのなんでなの
TL;DR
zxを使った
本当はワンライナーで行きたかったけど上手にできなかった...
使い方
- .envのあるディレクトリに移動する
$ yarn global add vercel
と$ vercel link
を済ませる$ zx /path/to/vercel.mjs
を実行して、指示に従う
コード
import path from "node:path";
import fs from "node:fs/promises";
import { cwd } from "node:process";
const rawEnv = await fs.readFile(path.join(cwd(), ".env"), "utf8");
const env = rawEnv.split("\n").filter(v => v !== "" && !v.startsWith("#")).map(v => v.split(/=(.+)/).slice(0, 2));
env.forEach(([key, value]) => {
console.log(chalk.blue(key), value);
})
const ok1 = await question("\npush ? [yN]: ")
if (ok1 !== "y") process.exit(0);
const ok2 = await question(`\nenvironment is ${chalk.red.bold("production")} ? [yN]: `)
if (ok2 !== "y") process.exit(0);
for await (const [key, value] of env) {
await $`vercel env add ${key} production <<< ${value}`
}
メモ、コメント
- production 固定なので適宜変更すること
- 削除は
await $`vercel env rm ${key} production -y`
(←全角の`を使ってる) - 重複したkeyがあるとvercelがError吐いて失敗する
- 削除済みのkeyを削除しようとするとvercelがError吐いて失敗する
最後に
眠くて超適当に書いたので、いつかちゃんとしたラッパーにしたい
追記
削除処理は $ vercel env ls
の結果を使った方が失敗しない
const result = await $`vercel env ls | awk '{ print $1; }'`
const envNames = result.toString().split("\n").slice(4).filter(v => v !== "");
envNames.forEach((name) => {
console.log(chalk.blue(name));
});
onst ok1 = await question("\nremove ? [yN]: ");
if (ok1 !== "y") process.exit(0);
for await (const key of envNames) {
await $`vercel env rm ${key} production -y`;
}