Quản lý toàn bộ biến môi trường của dự án tại 1 nơi bằng gem Figaro
Bài đăng này đã không được cập nhật trong 8 năm
1. Động cơ
- Hiện mình đang được tham gia một dự án Rails và cảm thấy rất háo hức khi được tìm hiểu, học hỏi những kiến thức mới sau một quãng thời gian dài không được đụng tay tới.
- Do đặc điểm hơn một năm vừa qua không được trực tiếp đụng tay tới việc code, mình để ý hơn tới những kỹ thuật làm sao để dự án được bắt đầu và diễn ra một cách trơn tru và mượt mà hơn.
- Một dự án Rails luôn có rất nhiều thông tin cần được giấu tại local và không để cho người ngoài biết, việc quản lý làm sao cho hiệu quả là điều mình trăn trở cho đến khi biết tới gem Figaro.
- Sử dụng gem Figaro có thể giúp bạn chuẩn hoá toàn bộ các dự án tham gia một cách dễ dàng
2. Workflow nếu KHÔNG dùng Figaro
Về cơ bản 1 dự án Rails tại Framgia, khi bắt đầu các bạn hay phải làm những điều sau đây:
- Tạo 1 dự án Rails bằng
rails new
- Cho
database.yml
vào.gitignore
, sau đó duplicate file này lên để tạo fie templatedatabase.yml.example
- Do cần secret key cho Rails app, sau khi dùng
rake secret
tạo key, lại ngậm ngùi vào folderconfig
tạosecrets.yml.template
(vâng lại là template), duplicate file này lên để tạo filesecrets.yml
, điền thông tin cần thiết vào rồi đưa file này vào trong.gitignore
để lại giấu nó đi. - Ngoài ra là rất nhiều biến môi trường khác nữa như secret key cho devise, thông tin về tài khoản email sẽ sử dụng để bắn mail...
3. Workflow nếu dùng Figaro
- Xem qua tài liệu về gem Figaro thôi. Cách sử dụng:
- add
figaro
vào Gemfile - bundle install
- bundle exec figaro install
- vâng thật đơn giản qua 3 bước cơ bản, 1 file tên
application.yml
đã được tạo ra cho bạn và file này cũng được tự động đưa vào.gitignore
. Do theo chuẩn yml cho nên việc thêm các trường key và value rất thân thuộc, ngoài ra cách gọi cũng không thể đơn giản hơnENV["{tên_key}"]
hoặcFigaro.env.{tên_key}
. Chấm hết
- Nếu là lần đầu tiên sử dụng, hãy tạo 1 folder bất kỳ, trong đó sẽ chứa file
database.yml
,secrets.yml
,application.yml.example
mà bạn chuẩn hoá để sử dụng trong tất cả các dự án từ nay về sau. Ví dụ:
- database.yml
common: &common
adapter: mysql2
encoding: utf8mb4
collation: utf8mb4_bin
username: <%= Figaro.env.database_username %>
password: <%= Figaro.env.database_password %>
reconnect: <%= Figaro.env.database_reconnect %>
pool: <%= Figaro.env.database_pool %>
host: <%= Figaro.env.database_host %>
database: <%= Figaro.env.database_name %>
development:
<<: *common
production:
<<: *common
- secrets.yml
common: &common
secret_key_base: <%= Figaro.env.secret_key_base %>
development:
<<: *common
production:
<<: *common
- application.yml.example
secret_key_base:
database_username:
database_password:
database_reconnect:
database_host:
database_pool:
database_name:
mail_username:
mail_password:
production:
secret_key_base:
devise_key_base:
database_username:
database_password:
database_reconnect:
database_host:
database_pool:
database_name:
mail_username:
mail_password:
- Copy 3 file trên vào folder
config
của dự án (file application.yml.example - sẽ giúp các đồng đội khác dễ dàng trong việc setup biến môi trường của dự án) - Điền các thông tin cần thiết vào file
application.yml
theo format củaapplication.yml.example
. - Mọi thứ đã sẵn sàng cho bạn.
4. Kết luận
Theo tư tưởng Convention over configuration
của Rails, việc chuẩn hoá và giúp dev không mất công trong việc suy nghĩ và đưa ra nhiều quyết định (mà không làm giảm độ linh hoạt trong dự án) là ý tưởng của tôi khi quyết định đến với Figaro. Bằng việc sử dụng Figaro sẽ giúp các bạn bắt đầu 1 dự án dễ dàng và đỡ mất thời gian hơn, chuẩn hoá các dự án cũng như điều quan trọng nhất chính là có một nơi quản lý hiệu quả, giúp các bạn không cần lo nghĩ về việc quản lý các thông tin biến quan trọng trong dự án theo từng môi trường nữa. Đây chỉ là bài viết trình bày ý tưởng và mong các bạn có chút quan tâm tới Figaro, chi tiết hơn các bạn có thể xem trên Github của gem.
5. Vấn đề gặp phải
Đây chỉ là 1 vấn đề nhỏ, tuy nhiên tôi đã gặp khi sử dụng Rubymine. Rubymine tích hợp việc kết nối Database của dự án trong IDE của mình, dựa vào file database.yml
để login vào db luôn. Tuy nhiên do đã đưa các thông số này vào application.yml
do vậy gặp lỗi login. Mong các anh tài Rubymine sẽ sửa sớm.
Cám ơn các bạn đã xem bài viết
All rights reserved