Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Direnv: Quản lý biến môi trường riêng cho từng dự án liền mạch trên Linux & macOS

direnv là một tiện ích mở nguồn mở cho shell trên hệ điều hành UNIX như Linux và macOS. Nó được biên dịch thành một file thực thi tĩnh đơn lẻ và hỗ trợ các shell như bash, zsh, tcsh và fish.

Mục đích chính của direnv

Mục đích chính của direnv là cho phép các biến môi trường riêng cho từng dự án mà không làm rối file ~/.profile hoặc các file khởi động shell liên quan. Nó triển khai một cách mới để tải và gỡ tải các biến môi trường tùy thuộc vào thư mục hiện tại.

Nó được dùng để tải biến môi trường cho ứng dụng 12factor (phương pháp xây dựng ứng dụng phần mềm dưới dạng dịch vụ), tạo môi trường phát triển tách biệt cho từng dự án, và tải các bí mật cho việc triển khai. Ngoài ra, nó có thể dùng để xây dựng giải pháp cài đặt và quản lý đa phiên bản tương tự như rbenv, pyenv và phpenv.

Cơ chế hoạt động của direnv

Trước khi shell tải dấu nhắc lệnh, direnv kiểm tra sự tồn tại của file .envrc trong thư mục hiện tại (có thể hiển thị bằng lệnh pwd) và các thư mục cha. Quá trình kiểm tra này rất nhanh và không thể nhận thấy ở mỗi dấu nhắc.

Khi tìm thấy file .envrc với quyền phù hợp, nó tải file đó vào một sub-shell bash và lấy tất cả các biến được export để cung cấp cho shell hiện tại.

Cài đặt direnv trên hệ thống Linux

Trong hầu hết các bản phân phối Linux, gói direnv có sẵn để cài đặt từ kho mặc định bằng trình quản lý gói hệ thống như sau:

$ sudo apt install direnv #Debian, Ubuntu và Mint
$ sudo dnf install direnv #Fedora

Trên các bản phân phối khác như Red Hat Enterprise Linux (RHEL) và CentOS hoặc bất kỳ bản phân phối nào hỗ trợ snap, bạn có thể cài đặt nó dưới dạng snap. Điều này yêu cầu hệ thống đã cài đặt snapd.

$ sudo snap install direnv

Cách tích hợp direnv vào shell Bash

Sau khi cài đặt direnv, bạn cần tích hợp nó vào shell Linux hiện tại. Ví dụ với Bash, thêm dòng sau vào cuối file ~/.bashrc:

Đảm bảo dòng này xuất hiện sau rvm, git-prompt và các tiện ích mở rộng shell khác thao tác với dấu nhắc.

eval "$(direnv hook bash)"

Cho shell ZSH

Thêm dòng sau vào cuối file ~/.zshrc:

eval "$(direnv hook zsh)"

Cho shell FISH

Thêm dòng sau vào cuối file ~/.config/fish/config.fish:

eval (direnv hook fish)

Sau đó đóng cửa sổ terminal hiện tại và mở shell mới hoặc source file như sau:

$ source ~/.bashrc
$ source ~/.zshrc
$ source ~/.config/fish/config.fish

Cách sử dụng direnv trong shell Linux

Để minh họa cách direnv hoạt động, chúng ta sẽ tạo thư mục mới tên tecmint_projects và chuyển vào đó:

$ mkdir ~/tecmint_projects
$ cd tecmint_projects/

Tiếp theo, tạo biến mới tên TEST_VARIABLE trên dòng lệnh và khi echo, giá trị nên rỗng:

$ echo $TEST_VARIABLE

Bây giờ tạo file .envrc chứa mã Bash sẽ được tải bởi direnv. Thêm dòng "export TEST_VARIABLE=tecmint" vào file bằng lệnh echo và chuyển hướng đầu ra (>):

$ echo export TEST_VARIABLE=tecmint > .envrc

Mặc định, cơ chế bảo mật chặn việc tải file .envrc. Vì chúng ta biết file này an toàn, cần phê duyệt nội dung bằng lệnh:

$ direnv allow .

Khi nội dung file .envrc đã được cho phép tải, kiểm tra giá trị TEST_VARIABLE vừa thiết lập:

$ echo $TEST_VARIABLE

Khi thoát khỏi thư mục tecmint_project, direnv sẽ được gỡ tải và nếu kiểm tra lại giá trị TEST_VARIABLE, nó nên rỗng:

$ cd ..
$ echo $TEST_VARIABLE

Mỗi khi bạn chuyển vào thư mục tecmint_projects, file .envrc sẽ được tải như hình ảnh minh họa sau:

$ cd tecmint_projects/

Để thu hồi quyền ủy quyền của một file .envrc cho trước, sử dụng lệnh deny:

$ direnv deny . #trong thư mục hiện tại
HOẶC
$ direnv deny /path/to/.envrc

Để biết thêm thông tin và hướng dẫn sử dụng, xem trang man của direnv:

$ man direnv

Ngoài ra, direnv còn sử dụng stdlib (direnv-stdlib) đi kèm với nhiều hàm cho phép bạn dễ dàng thêm thư mục mới vào PATH và làm nhiều việc hơn nữa.

Để tìm tài liệu cho tất cả các hàm có sẵn, xem trang manual của direnv-stdlib:

$ man direnv-stdlib

Trên đây là tất cả nội dung chúng tôi muốn chia sẻ! Nếu bạn có bất kỳ câu hỏi hoặc ý tưởng nào, hãy sử dụng biểu mẫu phản hồi bên dưới.