kaz.dev

Vercelの環境変数へローカルの.envからプッシュしたい

tag: vercel


はじめに

pull はできるのに push はできないのなんでなの





TL;DR

zxを使った
本当はワンライナーで行きたかったけど上手にできなかった...

使い方

  1. .envのあるディレクトリに移動する
  2. $ yarn global add vercel$ vercel link を済ませる
  3. $ 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}`
}




メモ、コメント





最後に

眠くて超適当に書いたので、いつかちゃんとしたラッパーにしたい





追記

削除処理は $ 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`;
}