direnv เป็นส่วนขยายโอเพนซอร์สที่มีประโยชน์สำหรับเชลล์ของคุณบนระบบปฏิบัติการ UNIX เช่น Linux และ macOS โปรแกรมนี้คอมไพล์เป็นไฟล์รันได้แบบคงที่ (single static executable) และรองรับเชลล์อย่าง bash, zsh, tcsh, และ fish
จุดประสงค์หลักของ direnv
จุดประสงค์หลักของ direnv คือการอนุญาตให้ใช้ตัวแปรสภาพแวดล้อมเฉพาะโปรเจกต์โดยไม่ทำให้ ~/.profile หรือไฟล์เริ่มต้นเชลล์ที่เกี่ยวข้องอื่นๆ แลกแหลม มันนำเสนอวิธีใหม่ในการโหลดและยกเลิกการโหลดตัวแปรสภาพแวดล้อมโดยอิงตามไดเรกทอรีปัจจุบัน
โปรแกรมนี้ใช้สำหรับโหลดตัวแปรสภาพแวดล้อมของแอป 12factor (วิธีการสร้างแอป SaaS) สร้างสภาพแวดล้อมพัฒนาที่แยกจากกันต่อโปรเจกต์ และโหลดข้อมูลลับสำหรับการปรับใช้ นอกจากนี้ยังสามารถใช้สร้างโซลูชันการติดตั้งและจัดการหลายเวอร์ชันได้ เช่นเดียวกับ rbenv, pyenv, และ phpenv
Direnv ทำงานอย่างไร?
ก่อนที่เชลล์จะโหลดพรอมต์คำสั่ง direnv จะตรวจสอบความมีอยู่ของไฟล์ .envrc ในไดเรกทอรีปัจจุบัน (ซึ่งคุณสามารถแสดงได้ด้วยคำสั่ง pwd) และไดเรกทอรีผู้ปกครอง กระบวนการตรวจสอบนี้รวดเร็วและไม่สามารถสังเกตเห็นได้ในแต่ละพรอมต์
เมื่อพบไฟล์ .envrc ที่มีสิทธิ์เหมาะสม มันจะโหลดไฟล์นั้นเข้าไปใน bash sub-shell และจับตัวแปรที่ส่งออกทั้งหมด ทำให้พร้อมใช้งานในเชลล์ปัจจุบัน
การติดตั้ง direnv ในระบบ Linux
ในการแจกจ่าย Linux ส่วนใหญ่ แพ็กเกจ direnv พร้อมให้ติดตั้งจากที่เก็บเริ่มต้นโดยใช้ตัวจัดการแพ็กเกจของระบบ ดังนี้:
$ sudo apt install direnv #Debian,Ubuntu และ Mint $ sudo dnf install direnv #Fedora
ในการแจกจ่ายอื่นๆ เช่น Red Hat Enterprise Linux (RHEL) และ CentOS หรือการแจกจ่ายใดๆ ที่รองรับ snaps คุณสามารถติดตั้งเป็น snap ซึ่งต้องมี snapd ติดตั้งอยู่ในระบบ
$ sudo snap install direnv
วิธีเชื่อม direnv เข้ากับเชลล์ Bash ของคุณ
หลังจากติดตั้ง direnv แล้ว คุณต้องเชื่อมมันเข้ากับเชลล์ Linux ปัจจุบันของคุณ ตัวอย่างเช่นสำหรับ Bash ให้เพิ่มบรรทัดต่อไปนี้ที่ท้ายไฟล์ ~/.bashrc
ตรวจสอบให้แน่ใจว่ามันปรากฏแม้หลังจาก rvm, git-prompt และส่วนขยายเชลล์อื่นๆ ที่จัดการพรอมต์
eval "$(direnv hook bash)"
สำหรับ ZSH Shell
เพิ่มบรรทัดต่อไปนี้ที่ท้ายไฟล์ ~/.zshrc:
eval "$(direnv hook zsh)"
สำหรับ FISH Shell
เพิ่มบรรทัดต่อไปนี้ที่ท้ายไฟล์ ~/.config/fish/config.fish:
eval (direnv hook fish)
จากนั้นปิดหน้าต่างเทอร์มินัลที่ใช้งานอยู่และเปิดเชลล์ใหม่ หรือ source ไฟล์ตามที่แสดง:
$ source ~/.bashrc $ source ~/.zshrc $ source ~/.config/fish/config.fish
วิธีใช้ direnv ในเชลล์ Linux
เพื่อสาธิตว่า direnv ทำงานอย่างไร เราจะสร้างไดเรกทอรีใหม่ชื่อ tecmint_projects และเข้าไปในนั้น
$ mkdir ~/tecmint_projects $ cd tecmint_projects/
ต่อไป ให้สร้างตัวแปรใหม่ชื่อ TEST_VARIABLE บนบรรทัดคำสั่ง และเมื่อ echo ค่าควรจะว่างเปล่า:
$ echo $TEST_VARIABLE
ตอนนี้เราจะสร้างไฟล์ .envrc ใหม่ที่มีโค้ด Bash ที่จะถูกโหลดโดย direnv เรายังลองเพิ่มบรรทัด "export the TEST_VARIABLE=tecmint" ลงไปด้วยคำสั่ง echo และตัวดำเนินการเปลี่ยนทิศทางเอาต์พุต (>):
$ echo export TEST_VARIABLE=tecmint > .envrc
โดยค่าเริ่มต้น กลไกความปลอดภัยจะบล็อกการโหลดไฟล์ .envrc เนื่องจากเรารู้ว่ามันเป็นไฟล์ที่ปลอดภัย เราจึงต้องอนุมัติเนื้อหาของมันโดยรันคำสั่งต่อไปนี้:
$ direnv allow .
ตอนนี้เนื้อหาของไฟล์ .envrc ได้รับอนุญาตให้โหลดแล้ว ให้ตรวจสอบค่าของ TEST_VARIABLE ที่เราตั้งไว้ก่อนหน้านี้:
$ echo $TEST_VARIABLE
เมื่อเราออกจากไดเรกทอรี tecmint_project direnv จะถูกยกเลิกการโหลด และถ้าเราตรวจสอบค่า TEST_VARIABLE อีกครั้ง ควรจะว่างเปล่า:
$ cd .. $ echo $TEST_VARIABLE
ทุกครั้งที่คุณเข้าไปในไดเรกทอรี tecmint_projects ไฟล์ .envrc จะถูกโหลดตามที่แสดงในภาพหน้าจอต่อไปนี้:
$ cd tecmint_projects/
เพื่อเพิกถอนการอนุญาตของ .envrc ที่กำหนด ให้ใช้คำสั่ง deny
$ direnv deny . #ในไดเรกทอรีปัจจุบัน หรือ $ direnv deny /path/to/.envrc
สำหรับข้อมูลเพิ่มเติมและคำแนะนำการใช้งาน โปรดดูหน้าคู่มือ direnv:
$ man direnv
นอกจากนี้ direnv ยังใช้ stdlib (direnv-stdlib) ที่มาพร้อมกับฟังก์ชันหลายอย่างซึ่งช่วยให้คุณเพิ่มไดเรกทอรีใหม่เข้าไปใน PATH ของคุณได้อย่างง่ายดาย และทำอะไรได้อีกมากมาย
เพื่อหาเอกสารสำหรับฟังก์ชันที่มีอยู่ทั้งหมด โปรดตรวจสอบหน้าคู่มือ direnv-stdlib:
$ man direnv-stdlib
ขอจบเพียงเท่านี้ หากคุณมีคำถามหรือความคิดเห็นที่ต้องการแบ่งปัน โปรดใช้แบบฟอร์มความคิดเห็นด้านล่าง