JSPM

  • Created
  • Published
  • Downloads 2042767
  • Score
    100M100P100Q216555F
  • License MIT

a better dotenv–from the creator of `dotenv`

Package Exports

  • @dotenvx/dotenvx
  • @dotenvx/dotenvx/src/lib/main.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@dotenvx/dotenvx) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

dotenvx

a better dotenv–from the creator of dotenv.

  • run anywhere (cross-platform)
  • multi-environment
  • encrypted envs

 

Quickstart

brew install dotenvx/brew/dotenvx

 

Run Anywhere

$ echo "HELLO=World" > .env
$ echo "console.log('Hello ' + process.env.HELLO)" > index.js

$ node index.js
Hello undefined

$ dotenvx run -- node index.js
Hello World
> :-D

More examples

  • Python 🐍
    $ echo "HELLO=World" > .env
    $ echo 'import os;print("Hello " + os.getenv("HELLO", ""))' > index.py
    
    $ dotenvx run -- python3 index.py
    Hello World
  • PHP 🐘
    $ echo "HELLO=World" > .env
    $ echo '<?php echo "Hello {$_SERVER["HELLO"]}\n";' > index.php
    
    $ dotenvx run -- php index.php
    Hello World
  • Ruby 💎
    $ echo "HELLO=World" > .env
    $ echo 'puts "Hello #{ENV["HELLO"]}"' > index.rb
    
    $ dotenvx run -- ruby index.rb
    Hello World
  • Go 🐹
    $ echo "HELLO=World" > .env
    $ echo 'package main; import ("fmt"; "os"); func main() { fmt.Printf("Hello %s\n", os.Getenv("HELLO")) }' > main.go
    
    $ dotenvx run -- go run main.go
    Hello World
  • Rust 🦀
    $ echo "HELLO=World" > .env
    $ echo 'fn main() {let hello = std::env::var("HELLO").unwrap_or("".to_string());println!("Hello {hello}");}' > src/main.rs
    
    $ dotenvx run -- cargo run
    Hello World
  • Java ☕️
    $ echo "HELLO=World" > .env
    $ echo 'public class Index { public static void main(String[] args) { System.out.println("Hello " + System.getenv("HELLO")); } }' > index.java
    
    $ dotenvx run -- java index.java
    Hello World
  • .NET 🔵
    $ dotnet new console -n HelloWorld -o HelloWorld
    $ cd HelloWorld
    $ echo "HELLO=World" > .env
    $ echo 'Console.WriteLine($"Hello {Environment.GetEnvironmentVariable("HELLO")}");' > Program.cs
    
    $ dotenvx run -- dotnet run
    Hello World
  • Bash 🖥️
    $ echo "HELLO=World" > .env
    
    $ dotenvx run --quiet -- sh -c 'echo $HELLO'
    World
  • Frameworks ▲
    $ dotenvx run -- next dev
    $ dotenvx run -- npm start
    $ dotenvx run -- bin/rails s
    $ dotenvx run -- php artisan serve
  • Docker 🐳
    $ docker run -it --rm -v $(pwd):/app dotenv/dotenvx run -- node index.js

    Or in any image:

    FROM node:latest
    RUN echo "HELLO=World" > .env && echo "console.log('Hello ' + process.env.HELLO)" > index.js
    RUN curl -fsS https://dotenvx.sh/ | sh
    CMD ["dotenvx", "run", "--", "echo", "Hello $HELLO"]
  • CI/CDs 🐙
    examples coming soon
  • Platforms
    examples coming soon
  • npx
    # alternatively use npx
    $ npx @dotenvx/dotenvx run -- node index.js
    $ npx @dotenvx/dotenvx run -- next dev
    $ npx @dotenvx/dotenvx run -- npm start
  • npm
    $ npm install @dotenvx/dotenvx --save
    {
      "scripts": {
        "start": "./node_modules/.bin/dotenvx run -- node index.js"
      },
      "dependencies": {
        "@dotenvx/dotenvx": "^0.5.0"
      }
    }
    $ npm run start
    
    > start
    > ./node_modules/.bin/dotenvx run -- node index.js
    
    [dotenvx][info] loading env (1) from .env
    Hello World
  • Git
    # use as a git submodule
    $ git dotenvx run -- node index.js
    $ git dotenvx run -- next dev
    $ git dotenvx run -- npm start

 

Multiple Environments

Create a .env.production file and use --env-file to load it. It's straightforward, yet flexible.

$ echo "HELLO=production" > .env.production
$ echo "console.log('Hello ' + process.env.HELLO)" > index.js

$ dotenvx run --env-file=.env.production -- node index.js
[dotenvx][info] loading env (1) from .env.production
Hello production
> ^^

More examples

  • multiple `.env` files
    $ echo "HELLO=local" > .env.local
    
    $ echo "HELLO=World" > .env
    
    $ dotenvx run --env-file=.env.local --env-file=.env -- node index.js
    [dotenvx][info] loading env (1) from .env.local,.env
    Hello local
  • `--overload` flag
    $ echo "HELLO=local" > .env.local
    
    $ echo "HELLO=World" > .env
    
    $ dotenvx run --env-file=.env.local --env-file=.env --overload -- node index.js
    [dotenvx][info] loading env (1) from .env.local,.env
    Hello World
  • `--verbose` flag
    $ echo "HELLO=production" > .env.production
    
    $ dotenvx run --env-file=.env.production --verbose -- node index.js
    [dotenvx][verbose] injecting env from /path/to/.env.production
    [dotenvx][verbose] HELLO set
    [dotenvx][info] loading env (1) from .env.production
    Hello production
  • `--debug` flag
    $ echo "HELLO=production" > .env.production
    
    $ dotenvx run --env-file=.env.production --debug -- node index.js
    [dotenvx][debug] configuring options
    [dotenvx][debug] {"envFile":[".env.production"]}
    [dotenvx][verbose] injecting env from /path/to/.env.production
    [dotenvx][debug] reading env from /path/to/.env.production
    [dotenvx][debug] parsing env from /path/to/.env.production
    [dotenvx][debug] {"HELLO":"production"}
    [dotenvx][debug] writing env from /path/to/.env.production
    [dotenvx][verbose] HELLO set
    [dotenvx][debug] HELLO set to production
    [dotenvx][info] loading env (1) from .env.production
    Hello production

 

Encryption

Encrypt your secrets to a .env.vault file and load from it (recommended for production and ci).

$ echo "HELLO=World" > .env
$ echo "HELLO=production" > .env.production
$ echo "console.log('Hello ' + process.env.HELLO)" > index.js

$ dotenvx encrypt
[dotenvx][info] encrypted to .env.vault (.env,.env.production)
[dotenvx][info] keys added to .env.keys (DOTENV_KEY_PRODUCTION,DOTENV_KEY_PRODUCTION)

$ DOTENV_KEY='<dotenv_key_production>' dotenvx run -- node index.js
[dotenvx][info] loading env (1) from encrypted .env.vault
Hello production
^ :-]

More examples

  • AWS Lambda
    coming soon
  • Digital Ocean
    coming soon
  • Docker
    coming soon
  • Fly.io
    coming soon
  • Heroku

    Add the buildpack, installing the dotenvx binary to your heroku deployment.

    heroku buildpacks:add https://github.com/dotenvx/heroku-buildpack-dotenvx

    Use it in your Procfile.

    web: dotenvx run -- node index.js

    buildpack docs

  • Laravel Forge
    coming soon
  • Netlify
    coming soon
  • Railway
    coming soon
  • Render
    coming soon
  • Vercel
    coming soon
  • CircleCI
    coming soon
  • GitHub Actions
    coming soon

 

Guides

Pre-commit

You can prevent .env files from being committed to code with this pre-commit hook.

Place this in .git/hooks/pre-commit

#!/bin/sh
dotenvx precommit --quiet

# Check dotenvx precommit exit status
if [ $? -ne 0 ]; then
  echo "dotenvx pre-commit failed. run [dotenvx precommit] for more information"
  exit 1
fi
exit 0

Make sure to make it executable.

chmod +x .git/hooks/pre-commit

You can simulate the pre-commit hook by running dotenvx precommit locally.

Contributing

You can fork this repo and create pull requests or if you have questions or feedback: