在開發中使用 Shim 將環境變數從.env
載入到ENV
中。
在環境中儲存配置是十二要素應用程式的原則之一。部署環境之間可能發生變化的任何內容(例如資料庫的資源句柄或外部服務的憑證)都應從程式碼中提取到環境變數中。
但在運行多個專案的開發機器或持續整合伺服器上設定環境變數並不總是可行的。當環境引導時,dotenv 將變數從.env
檔案載入到ENV
中。
將此行新增至應用程式 Gemfile 的頂部並執行bundle install
:
gem 'dotenv' , groups : [ :development , :test ]
將應用程式設定新增至專案根目錄下的.env
檔案:
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
每當您的應用程式載入時,這些變數都將在ENV
中可用:
config . fog_directory = ENV [ 'S3_BUCKET' ]
請參閱 API 文件以了解更多資訊。
Dotenv 將在 Rails 應用程式啟動時自動載入。請參閱自訂 Rails 以變更載入哪些檔案以及何時載入。
在應用程式引導過程中儘早載入 Dotenv:
require 'dotenv/load'
# or
require 'dotenv'
Dotenv . load
預設情況下, load
將在目前工作目錄中尋找名為.env
的檔案。傳入多個文件,它們將按順序加載。為變數設定的第一個值將獲勝。
require 'dotenv'
Dotenv . load ( 'file1.env' , 'file2.env' )
從 3.0 開始,Rails 應用程式中的 dotenv 將在每次測試後自動恢復ENV
。這意味著您可以在測試中修改ENV
,而不必擔心將狀態洩漏給其他測試。它適用於ActiveSupport::TestCase
和Rspec
。
若要停用此行為,請在config/application.rb
或config/environments/test.rb
中設定config.dotenv.autorestore = false
。如果您的應用程式使用climate_control或ice_age,則預設情況下會停用它。
要在 Rails 應用程式之外使用此行為,只需在測試套件中require "dotenv/autorestore"
。
有關手動使用,請參閱Dotenv.save
、 Dotenv.restore 和Dotenv.modify(hash) { ... }
。
為了確保.env
載入到 rake 中,請載入任務:
require 'dotenv/tasks'
task mytask : :dotenv do
# things that require .env
end
您可以在啟動應用程式之前使用dotenv
執行檔 load .env
:
$ dotenv ./script.rb
dotenv
可執行檔也接受標誌-f
。它的值應該是一個以逗號分隔的配置文件列表,按最重要到最不重要的順序排列。所有文件都必須存在。標誌與其值之間必須有一個空格。
$ dotenv -f " .env.local,.env " ./script.rb
dotenv
可執行檔可以選擇使用-i
或--ignore
標誌忽略遺失的檔案。例如,如果.env.local
檔案不存在,則以下命令將忽略遺失的檔案並僅載入.env
檔案。
$ dotenv -i -f " .env.local,.env " ./script.rb
如果您使用的 gem 需要在載入之前設定環境變量,則在Gemfile
中將dotenv
列在其他 gem 之前,並需要dotenv/load
。
gem 'dotenv' , require : 'dotenv/load'
gem 'gem-that-requires-env-variables'
Dotenv 將根據RAILS_ENV
載入以下文件,第一個文件具有最高優先級, .env
具有最低優先級:
優先事項 | 環境 | .gitignore 嗎? | 筆記 | ||
---|---|---|---|---|---|
發展 | 測試 | 生產 | |||
最高 | .env.development.local | .env.test.local | .env.production.local | 是的 | 環境特定的本地覆蓋 |
第二名 | .env.local | 不適用 | .env.local | 是的 | 本地覆蓋 |
第三名 | .env.development | .env.test | .env.production | 不 | 共享環境特定變數 |
最後的 | .env | .env | .env | 或許 | 為所有環境共享 |
這些檔案在before_configuration
回呼期間加載,當在config/application.rb
中使用class Application < Rails::Application
定義Application
常數時會觸發該回呼。如果您需要更快地初始化,或者需要自訂載入過程,可以在application.rb
的頂部進行
# config/application.rb
Bundler . require ( * Rails . groups )
# Load .env.local in test
Dotenv :: Rails . files . unshift ( ".env.local" ) if ENV [ "RAILS_ENV" ] == "test"
module YourApp
class Application < Rails :: Application
# ...
end
end
可用選項:
Dotenv::Rails.files
- 要載入的檔案列表,按優先順序排列。Dotenv::Rails.overwrite
- 使用.env*
檔案的內容覆蓋現有ENV
變量Dotenv::Rails.logger
- 用於 dotenv 日誌記錄的記錄器。預設為Rails.logger
Dotenv::Rails.autorestore
- 啟用或停用自動復原帶換行符的多行值必須用雙引號引起來。
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----
...
HkVN9...
...
-----END DSA PRIVATE KEY----- "
在 3.0 之前,dotenv 會用換行符號替換引號的字串中的n
,但該行為已被棄用。若要使用舊行為,請在包含n
任何變數之前設定DOTENV_LINEBREAK_MODE=legacy
:
DOTENV_LINEBREAK_MODE=legacy
PRIVATE_KEY= " -----BEGIN RSA PRIVATE KEY-----nHkVN9...n-----END DSA PRIVATE KEY-----n "
您需要在變數之一中新增命令的輸出嗎?只需使用$(your_command)
來新增它:
DATABASE_URL= " postgres:// $( whoami ) @localhost/my_database "
您需要將另一個變數的值加到您的一個變數中嗎?您可以使用${VAR}
引用變量,或通常只使用不含引號或雙引號的值中的$VAR
來引用變數。
DATABASE_URL= " postgres:// ${USER} @localhost/my_database "
如果值包含$
並且它不打算作為變量,請將其用單引號引起來。
PASSWORD= ' pas$word '
註釋可以添加到您的文件中,如下所示:
# This is a comment
SECRET_KEY=YOURSECRETKEYGOESHERE # comment
SECRET_HASH= " something-with-a-#-hash "
為了相容性,您還可以在每行前面新增export
,以便您可以在 bash 中source
檔案:
export S3_BUCKET=YOURS3BUCKET
export SECRET_KEY=YOURSECRETKEYGOESHERE
如果需要但未設定特定的配置值,則可以適當地引發錯誤。
需要配置金鑰:
# config/initializers/dotenv.rb
Dotenv . require_keys ( "SERVICE_APP_ID" , "SERVICE_KEY" , "SERVICE_SECRET" )
如果未設定上述任何配置鍵,您的應用程式將在初始化期間引發錯誤。此方法是首選方法,因為它可以防止生產應用程式中由於配置不當而導致的運行時錯誤。
要解析 env 檔案清單以進行程式檢查而不修改 ENV:
Dotenv . parse ( ".env.local" , ".env" )
# => {'S3_BUCKET' => 'YOURS3BUCKET', 'SECRET_KEY' => 'YOURSECRETKEYGOESHERE', ...}
此方法傳回 ENV var 名稱/值對的雜湊。
您可以在 dotenv cli 上使用-t
或--template
標誌來建立.env
檔案的模板。
$ dotenv -t .env
將在您的工作目錄中建立一個名為{FILENAME}.template
範本。因此,在上面的範例中,它將建立一個.env.template
檔案。
此範本將包含.env
檔案中的所有環境變量,但它們的值設定為變數名稱。
# .env
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
會變成
# .env.template
S3_BUCKET=S3_BUCKET
SECRET_KEY=SECRET_KEY
dotenv 最初是為了在開發中將組態變數載入到ENV
中而建立的。通常有更好的方法來管理生產環境中的配置 - 例如由 Puppet 或 Chef 管理的/etc/environment
、 heroku config
等。
然而,有些人發現 dotenv 是在暫存和生產環境中配置 Rails 應用程式的便捷方法,您可以透過定義特定於環境的檔案(例如.env.production
或.env.test
)來實現這一點。
如果您使用此 gem 處理多個 Rails 環境(開發、測試、生產等)的環境變量,請注意,所有環境通用的環境變數應儲存在.env
中。然後,特定於環境的環境變數應儲存在.env.
中。
憑證只能在需要存取憑證的電腦上才能存取。切勿將敏感資訊提交至並非每台開發電腦和伺服器都需要的儲存庫。
就個人而言,我更喜歡使用僅開發設定提交.env
檔案。這使得其他開發人員可以輕鬆開始該項目,而不會影響其他環境的憑證。如果您遵循此建議,請確保您的開發環境的所有憑證都與其他部署不同,並且開發憑證無權存取任何機密資料。
ENV
變數?預設情況下,它不會覆蓋現有的環境變量,因為 dotenv 假設部署環境比應用程式擁有更多有關配置的知識。若要覆寫現有環境變量,您可以使用Dotenv.load files, overwrite: true
。
您也可以在 dotenv cli 上使用-o
或--overwrite
標誌來覆寫現有ENV
變數。
$ dotenv -o -f " .env.local,.env "
如果您想更深入了解 dotenv 的工作原理,請查看 dotenv 的 Ruby Rogues 程式碼閱讀。
git checkout -b my-new-feature
)git commit -am 'Added some feature'
)git push origin my-new-feature
)