env-cmd vs cross-env vs dotenv vs dotenv-flow
環境変数管理ライブラリ
env-cmdcross-envdotenvdotenv-flow類似パッケージ:

環境変数管理ライブラリ

環境変数管理ライブラリは、アプリケーションの設定や環境に依存する情報を管理するためのツールです。これらのライブラリは、開発環境や本番環境での設定を簡単に切り替えたり、環境変数を安全に管理したりすることを目的としています。これにより、コードの移植性が向上し、異なる環境での動作を容易にします。

npmのダウンロードトレンド

3 年

GitHub Starsランキング

統計詳細

パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
env-cmd1,569,2621,81655.2 kB258ヶ月前MIT
cross-env06,52720.2 kB17ヶ月前MIT
dotenv020,412103 kB222日前BSD-2-Clause
dotenv-flow090160.3 kB82年前MIT

機能比較: env-cmd vs cross-env vs dotenv vs dotenv-flow

環境変数の読み込み

  • env-cmd:

    env-cmdは、指定した環境変数ファイルを使用してアプリケーションを起動するためのツールです。これにより、異なる環境での設定を簡単に切り替えることができます。

  • cross-env:

    cross-envは、コマンドラインで環境変数を設定するためのツールで、特にスクリプト内での使用に適しています。WindowsとUnix系の両方で動作するため、クロスプラットフォームでの開発に便利です。

  • dotenv:

    dotenvは、.envファイルから環境変数を自動的に読み込むシンプルな方法を提供します。これにより、アプリケーションの設定を簡単に管理できます。

  • dotenv-flow:

    dotenv-flowは、複数の.envファイルをサポートし、環境ごとに異なる設定を簡単に管理できます。これにより、開発、テスト、本番環境での設定を柔軟に切り替えられます。

使いやすさ

  • env-cmd:

    env-cmdは、コマンドラインで環境変数ファイルを指定するだけで使えるため、使いやすさに優れています。

  • cross-env:

    cross-envは、コマンドライン引数で環境変数を設定するため、特別な設定は不要で、すぐに使用できます。

  • dotenv:

    dotenvは、.envファイルをプロジェクトのルートに置くだけで使用できるため、非常にシンプルで使いやすいです。

  • dotenv-flow:

    dotenv-flowは、dotenvの使いやすさを維持しつつ、複数の環境をサポートします。設定ファイルを追加するだけで、異なる環境に対応できます。

設定の柔軟性

  • env-cmd:

    env-cmdは、複数の環境変数ファイルを指定できるため、柔軟な設定が可能です。

  • cross-env:

    cross-envは、コマンドラインで直接環境変数を設定できるため、柔軟な設定が可能です。

  • dotenv:

    dotenvは、単一の.envファイルから環境変数を読み込むため、設定がシンプルですが、柔軟性は限られています。

  • dotenv-flow:

    dotenv-flowは、複数の環境ファイルをサポートするため、柔軟な設定が可能で、異なる環境に応じた設定を簡単に切り替えられます。

クロスプラットフォームサポート

  • env-cmd:

    env-cmdは、Node.js環境で動作し、異なるプラットフォームでの使用が可能です。

  • cross-env:

    cross-envは、WindowsとUnix系の両方で動作するため、クロスプラットフォーム開発に最適です。

  • dotenv:

    dotenvは、Node.js環境で動作するため、特にNode.jsアプリケーションに適していますが、プラットフォームに依存しません。

  • dotenv-flow:

    dotenv-flowもNode.js環境で動作し、複数の環境をサポートします。

デバッグ機能

  • env-cmd:

    env-cmdは、指定した環境変数ファイルを使用してアプリケーションを起動するため、デバッグ時に特定の設定を簡単に適用できます。

  • cross-env:

    cross-envは、環境変数をコマンドラインで直接設定するため、デバッグ時に環境変数を簡単に変更できます。

  • dotenv:

    dotenvは、.envファイルを使用するため、環境変数の設定を簡単に確認できますが、リアルタイムのデバッグ機能はありません。

  • dotenv-flow:

    dotenv-flowは、複数の.envファイルを使用するため、異なる環境でのデバッグが容易です。

選び方: env-cmd vs cross-env vs dotenv vs dotenv-flow

  • env-cmd:

    env-cmdは、複数の環境変数ファイルを簡単に切り替えられる機能を提供します。特に、異なる環境でのテストやデプロイを行う際に役立ちます。

  • cross-env:

    cross-envは、異なるオペレーティングシステム間で環境変数を設定する必要がある場合に最適です。特に、WindowsとUnix系システムの両方で動作するスクリプトを作成する際に便利です。

  • dotenv:

    dotenvは、.envファイルから環境変数を読み込むシンプルな方法を提供します。プロジェクトの設定が少ない場合や、環境変数の数が限られている場合に適しています。

  • dotenv-flow:

    dotenv-flowは、dotenvの拡張版で、複数の環境(.env, .env.development, .env.productionなど)をサポートします。異なる環境での設定を管理する必要がある場合に便利です。

env-cmd のREADME

Linux Tests Windows Tests Coverage Status npm npm License Typescript-ESLint

env-cmd

A simple node program for executing commands using an environment from an env file.

💾 Install

npm install env-cmd or npm install -g env-cmd

⌨️ Basic Usage

Environment file ./.env

# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH

Package.json

{
  "scripts": {
    "test": "env-cmd -- mocha -R spec"
  }
}

Terminal

./node_modules/.bin/env-cmd -- node index.js

Using custom env file path

To use a custom env filename or path, pass the -f flag. This is a major breaking change from prior versions < 9.0.0

Terminal

./node_modules/.bin/env-cmd -f ./custom/path/.env -- node index.js

📜 Help

Usage: env-cmd [options] -- <command> [...args]

Options:
  -v, --version                 output the version number
  -e, --environments [envs...]  The rc file environment(s) to use
  -f, --file [path]             Custom env file path or .rc file path if '-e' used (default path: ./.env or ./.env-cmdrc.(js|cjs|mjs|json))
  -x, --expand-envs             Replace $var and ${var} in args and command with environment variables
  --recursive                   Replace $var and ${var} in env file with the referenced environment variable
  --fallback                    Fallback to default env file path, if custom env file path not found
  --no-override                 Do not override existing environment variables
  --silent                      Ignore any env-cmd errors and only fail on executed program failure.
  --use-shell                   Execute the command in a new shell with the given environment
  --verbose                     Print helpful debugging information
  -h, --help                    display help for command

🔬 Advanced Usage

.rc file usage

For more complex projects, a .env-cmdrc file can be defined in the root directory and supports as many environments as you want. Simply use the -e flag and provide which environments you wish to use from the .env-cmdrc file. Using multiple environment names will merge the environment variables together. Later environments overwrite earlier ones in the list if conflicting environment variables are found.

.rc file ./.env-cmdrc

{
  "development": {
    "ENV1": "Thanks",
    "ENV2": "For All"
  },
  "test": {
    "ENV1": "No Thanks",
    "ENV3": "!"
  },
  "production": {
    "ENV1": "The Fish"
  }
}

Terminal

./node_modules/.bin/env-cmd -e production -- node index.js
# Or for multiple environments (where `production` vars override `test` vars,
# but both are included)
./node_modules/.bin/env-cmd -e test,production -- node index.js

--no-override option

Prevents overriding of existing environment variables on process.env and within the current environment.

--fallback file usage option

If the .env file does not exist at the provided custom path, then use the default fallback location ./.env env file instead.

--use-shell

Executes the command within a new shell environment. This is useful if you want to string multiple commands together that share the same environment variables.

Terminal

./node_modules/.bin/env-cmd -f ./test/.env --use-shell -- "npm run lint && npm test"

Asynchronous env file support

EnvCmd supports reading from asynchronous .env files. Instead of using a .env file, pass in a .js file that exports either an object or a Promise resolving to an object ({ ENV_VAR_NAME: value, ... }). Asynchronous .rc files are also supported using .js file extension and resolving to an object with top level environment names ({ production: { ENV_VAR_NAME: value, ... } }).

Terminal

./node_modules/.bin/env-cmd -f ./async-file.js -- node index.js

-x expands vars in arguments

EnvCmd supports expanding $var values passed in as arguments to the command. The allows a user to provide arguments to a command that are based on environment variable values at runtime.

NOTE: You must escape the $ character with \ or your terminal might try to auto expand it before passing it to env-cmd.

Terminal

# $VAR will be expanded into the env value it contains at runtime
./node_modules/.bin/env-cmd -x -- node index.js --arg=\$VAR

or in package.json (use \\ to insert a literal backslash)

{
  "script": {
    "start": "env-cmd -x -- node index.js --arg=\\$VAR"
  }
}

--silent suppresses env-cmd errors

EnvCmd supports the --silent flag the suppresses all errors generated by env-cmd while leaving errors generated by the child process and cli signals still usable. This flag is primarily used to allow env-cmd to run in environments where the .env file might not be present, but still execute the child process without failing due to a missing file.

💿 Examples

You can find examples of how to use the various options above by visiting the examples repo env-cmd-examples.

💽️ Environment File Formats

These are the currently accepted environment file formats. If any other formats are desired please create an issue.

  • .env as key=value
  • .env.json Key/value pairs as JSON
  • .env.js JavaScript file exporting an object or a Promise that resolves to an object
  • .env-cmdrc as valid json or .env-cmdrc.json in execution directory with at least one environment { "dev": { "key1": "val1" } }
  • .env-cmdrc.js JavaScript file exporting an object or a Promise that resolves to an object that contains at least one environment

🗂 Path Rules

This lib attempts to follow standard bash path rules. The rules are as followed:

Home Directory = /Users/test

Working Directory = /Users/test/Development/app

TypeInput PathExpanded Path
Absolute/some/absolute/path.env/some/absolute/path.env
Home Directory with ~~/starts/on/homedir/path.env/Users/test/starts/on/homedir/path.env
Relative./some/relative/path.env or some/relative/path.env/Users/test/Development/app/some/relative/path.env
Relative with parent dir../some/relative/path.env/Users/test/Development/some/relative/path.env

🛠 API Usage

EnvCmd

A function that executes a given command in a new child process with the given environment and options

  • options { object }
    • command { string }: The command to execute (node, mocha, ...)
    • commandArgs { string[] }: List of arguments to pass to the command (['-R', 'Spec'])
    • envFile { object }
      • filePath { string }: Custom path to .env file to read from (defaults to: ./.env)
      • fallback { boolean }: Should fall back to default ./.env file if custom path does not exist
    • rc { object }
      • environments { string[] }: List of environment to read from the .rc file
      • filePath { string }: Custom path to the .rc file (defaults to: ./.env-cmdrc(|.js|.json))
    • options { object }
      • expandEnvs { boolean }: Expand $var values passed to commandArgs (default: false)
      • noOverride { boolean }: Prevent .env file vars from overriding existing process.env vars (default: false)
      • silent { boolean }: Ignore any errors thrown by env-cmd, used to ignore missing file errors (default: false)
      • useShell { boolean }: Runs command inside a new shell instance (default: false)
      • verbose { boolean }: Prints extra debug logs to console.info (default: false)
    • Returns { Promise<object> }: key is env var name and value is the env var value

GetEnvVars

A function that parses environment variables from a .env or a .rc file

  • options { object }
    • envFile { object }
      • filePath { string }: Custom path to .env file to read from (defaults to: ./.env)
      • fallback { boolean }: Should fall back to default ./.env file if custom path does not exist
    • rc { object }
      • environments { string[] }: List of environment to read from the .rc file
      • filePath { string }: Custom path to the .rc file (defaults to: ./.env-cmdrc(|.js|.json))
    • verbose { boolean }: Prints extra debug logs to console.info (default: false)
  • Returns { Promise<object> }: key is env var name and value is the env var value

🧙 Why

Because sometimes it is just too cumbersome passing a lot of environment variables to scripts. It is usually just easier to have a file with all the vars in them, especially for development and testing.

🚨Do not commit sensitive environment data to a public git repo! 🚨

🧬 Related Projects

cross-env - Cross platform setting of environment scripts

📋 Contributing Guide

I welcome all pull requests. Please make sure you add appropriate test cases for any features added. Before opening a PR please make sure to run the following scripts:

  • npm run lint checks for code errors and format according to ts-standard
  • npm test make sure all tests pass
  • npm run test-cover make sure the coverage has not decreased from current master