見出し画像

複数プロジェクトでの環境変数管理を簡素化するシンボリックリンクの利点と注意点

現代のソフトウェア開発では、フロントエンドとバックエンドのプロジェクトで環境変数を分離するのが一般的です。しかし、モノリスの場合、個別の.envファイルを管理するのは煩雑であり、単一の情報源が望ましいでしょう。モノレポ内の複数のプロジェクトで単一の.envファイルを効率的に管理・共有し、チームの同期を維持するにはどうすればよいでしょうか?
一つの解決策は、シンボリックリンク(symlinks)の使用です。では、シンボリックリンクはこの状況でどのように役立つのでしょうか?また、欠点はあるのでしょうか?詳しく見ていきましょう。

シンボリックリンクとは?

シンボリックリンクは、コンピュータ上のショートカットのようなもので、ファイルを移動やコピーすることなくアクセスできるようにします。開発の観点では、シンボリックリンクを使用することで、.envファイルなどのファイルをプロジェクト構造の複数の場所から参照することができます。

Node.jsプロジェクトにおけるシンボリックリンクの仕組み

Node.jsプロジェクトでは、異なるプロジェクト間で環境変数を扱う際にシンボリックリンクが非常に有用です。モノレポのルートに配置された単一の.envファイルへのシンボリックリンクを作成することで、すべてのプロジェクト(バックエンド、フロントエンド、その他)が複数のコピーを必要とせずに同じ環境変数を参照できます。

モノレポにおける.envファイルのシンボリックリンク設定

この例では、モノレポ管理にTurborepoとYarn workspacesを使用します。プロジェクトのルートから単一の.envファイルのシンボリックリンクを設定し、フロントエンド、バックエンド、その他のアプリケーション間で共有するスクリプトを作成します。
以下はプロジェクト構造の例です:

/monolith
  /apps
    /backend
    /frontend
    /extra
  .env
  setup-symlink.js
  package.json

setup-symlink.jsスクリプトは、.envファイルがapps/backend、apps/frontend、apps/extraディレクトリにシンボリックリンクされることを保証します。

setup-symlink.jsスクリプトの内容

const { execSync } = require("child_process");
const fs = require("fs");
const path = require("path");

const sourceEnvPath = path.resolve(__dirname, "./.env"); // Root-level .env file
const targetEnvPaths = [
    path.resolve(__dirname, "./apps/backend/.env"), // Backend .env file
    path.resolve(__dirname, "./apps/frontend/.env"), // Frontend .env file
    path.resolve(__dirname, "./apps/extra/.env"), // Extra .env file
];

// Create symlinks for each target
targetEnvPaths.forEach((targetPath) => {
    if (fs.existsSync(targetPath)) {
        if (fs.lstatSync(targetPath).isSymbolicLink()) {
            console.log(`Symlink already exists: ${targetPath}`);
        } else {
            console.log(`A file or folder exists at ${targetPath}, cannot create symlink.`);
        }
    } else {
        try {
            // Create symlink based on platform (Windows or Unix-like)
            if (process.platform === "win32") {
                execSync(`mklink "${targetPath}" "${sourceEnvPath}"`, {
                    stdio: "inherit",
                });
                console.log("Symlink created on Windows");
            } else {
                execSync(`ln -s "${sourceEnvPath}" "${targetPath}"`, {
                    stdio: "inherit",
                });
                console.log("Symlink created on Unix-like system");
            }
        } catch (err) {
            console.error("Error creating symlink:", err.message);
        }
    }
});

スクリプトの使用方法

  1. ルートレベルの.env:まず、モノレポのルートに.envファイルを作成します。これがすべてのアプリケーション間で環境変数の単一の情報源となります。

  2. package.jsonへのスクリプト追加:シンボリックリンクの作成を自動化するため、ルートのpackage.jsonに以下を追加します:

{
  "scripts": {
    "setup": "cp .env.example .env && yarn",
    "start": "turbo run start",
    "dev": "node ./setup-symlink.js && turbo run dev",
    "build": "turbo run build"
  }
}

yarn devを実行すると、シンボリックリンクが作成され、各アプリケーションがルートレベルの.envファイルを参照するようになります。これにより、すべてのアプリケーション(バックエンド、フロントエンド、その他)が同じ環境変数を使用することが保証されます。

シンボリックリンクの利点

  1. 一貫性:すべてのプロジェクトが同じ.envファイルにアクセスし、環境間の一貫性を確保します。

  2. 管理の容易さ:単一の.envファイルを更新するだけで、すべてのアプリケーションの変数が更新されます。

  3. ディスク容量の効率性:シンボリックリンクはポインタに過ぎないため、実際の.envファイルを複製せず、ディスク容量を節約できます。

シンボリックリンクの欠点

  1. OS互換性:シンボリックリンクはWindows系とUnix系(Linux、macOS)で動作が異なります。スクリプトはこれに対応していますが、特定のケースでプラットフォームの違いが問題を引き起こす可能性があります。

  2. デプロイメントの考慮事項:一部のビルドツールやサーバーでシンボリックリンクが適切に処理されない場合があります。本番環境でシンボリックリンクが壊れないよう、デプロイメントプロセスのテストを確実に行ってください。

シンボリックリンクは、モノレポ内の複数のプロジェクト間で単一の.envファイルを管理する優れた方法を提供し、一貫性を確保しながら重複を減らします。TurborepoやYarn workspacesを使用するNode.jsモノレポのセットアップでは、シンボリックリンクによって環境変数の共有ソースを簡単に管理できます。
シンボリックリンクを使用することで、チームが単一の.envファイルで作業しながら、すべてを同期状態に保ち、開発とCI/CDパイプラインを簡素化できます。
詳細な情報と実際の動作を確認するには、参考プロジェクトdibe-sh/symlinkをご覧ください。それでは、次回まで、ハッピーコーディング 👨‍💻。


この記事は、2024 年 11 月に弊社のエンジニア Dibesh Raj Subedi が執筆し、日本語に翻訳されました。
英語版はこちらをクリックしてください。
https://articles.wesionary.team/share-a-single-env-file-across-multiple-projects-using-symlinks-0dc4def3baac


採用情報

私たちはプロダクト共創の仕組み化に取り組んでいます。プロダクト共創をリードするプロダクト・マネージャー、そして、私たちのビジョンを市場に届ける営業メンバーを募集しています!


開発パートナーをお探しの企業様へ

弊社は、グローバル開発のメリットを活かし、高い費用対効果と品質を両立しています。経験豊富で多様性のあるチームが、課題を正しく理解し、最適なシステムと優れた体験を実現します。業務システムの開発、新規事業の開発、業務効率化やDX化に関するお困りごと、ぜひ弊社にご相談ください。