DIRENV-STDLIB(1) User Manuals DIRENV-STDLIB(1)

direnv-stdlib - توابع برای .envrc

direnv stdlib

یک اسکریپت bash موسوم به stdlib را خروجی می‌دهد. دستورهای زیر در آن اسکریپت گنجانده شده‌اند و در زمینهٔ یک .envrc بارگذاری می‌شوند. علاوه بر این، در صورت وجود، فایل موجود در ~/.config/direnv/direnvrc را نیز بارگذاری می‌کند.

اگر command در دسترس باشد مقدار 0 و در غیر این صورت مقدار 1 را برمی‌گرداند. این می‌تواند یک باینری در PATH یا یک تابع پوسته باشد.

مثال:

if has curl; then
  echo "Yes we do"
fi

مسیر مطلق rel_path را نسبت به relative_to یا دایرکتوری فعلی خروجی می‌دهد.

مثال:

cd /usr/local/games
expand_path ../foo
# output: /usr/local/foo

یک فایل ".env" را در محیط فعلی بارگذاری می‌کند.

یک فایل ".env" را در محیط فعلی بارگذاری می‌کند، اما فقط در صورتی که وجود داشته باشد.

در صورت امکان، مسیر مطلق abs_path را به یک مسیر نسبی برای کاربر تبدیل می‌کند.

مثال:

echo $HOME
# output: /home/user
user_rel_path /home/user/my/project
# output: ~/my/project
user_rel_path /usr/local/lib
# output: /usr/local/lib

مسیر filename را هنگام جستجو از دایرکتوری فعلی رو به بالا تا / خروجی می‌دهد. اگر فایل پیدا نشود، مقدار 1 را برمی‌گرداند.

مثال:

cd /usr/local/my
mkdir -p project/foo
touch bar
cd project/foo
find_up bar
# output: /usr/local/my/bar

یک .envrc دیگر را با مشخص کردن مسیر یا نام فایل آن بارگذاری می‌کند.

نکته: فایل .envrc دیگر توسط چارچوب امنیتی بررسی نمی‌شود.

یک ".envrc" دیگر را بارگذاری می‌کند، اما فقط در صورتی که وجود داشته باشد.

نکته: برخلاف source_env، این دستور تنها زمانی کار می‌کند که مسیر یک فایل مشخص شده باشد،
نه یک دایرکتوری.

مثال:

source_env_if_exists .envrc.private
برای هر متغیری که در محیط وجود نداشته باشد یا مقدار آن خالی باشد، خطا ثبت می‌کند.
معمولاً این دستور در ترکیب با source_env و source_env_if_exists استفاده می‌شود.
مثال:
# expect .envrc.private to provide tokens
source_env .envrc.private
# check presence of tokens
env_vars_required GITHUB_TOKEN OTHER_TOKEN

در صورت پیدا شدن یک .envrc دیگر به وسیلهٔ دستور find_up، آن را بارگذاری می‌کند. اگر هیچ فایلی پیدا نشود، مقدار ۱ را بازمی‌گرداند.

نکته: .envrc دیگر توسط چارچوب امنیتی بررسی نمی‌شود.

در صورت پیدا شدن یک .envrc دیگر به وسیلهٔ دستور find_up، آن را بارگذاری می‌کند. اگر موردی یافت نشود، هیچ اتفاقی نمی‌افتد.

نکته: .envrc دیگر توسط چارچوب امنیتی بررسی نمی‌شود.

اسکریپت دیگری را از url داده‌شده بارگذاری می‌کند. پیش از بارگذاری، یکپارچگی آن را با استفاده از integrity-hash ارائه‌شده بررسی خواهد کرد.

برای یافتن مقدار integrity-hash، دستور direnv fetchurl <url> را اجرا کرده و هش را از پیام خروجی استخراج کنید.

همچنین برای جزئیات بیشتر direnv-fetchurl(1) را ببینید.

نشانی url داده‌شده را روی دیسک بارگیری کرده و مکان مسیر آن را در stdout خروجی می‌دهد.

اگر آرگومان integrity-hash ارائه شده باشد، صحت و یکپارچگی اسکریپت را نیز بررسی خواهد کرد.

همچنین برای جزئیات بیشتر direnv-fetchurl(1) را ببینید.

خروجی direnv dump را که در یک فایل ذخیره شده است بارگذاری می‌کند.

محیط تولیدشده حاصل از اجرای argv به عنوان یک دستور را اعمال می‌کند. این قابلیت برای اتخاذ محیط یک فرایند فرزند مفید است - ترتیبی دهید که آن فرایند “direnv dump” را اجرا کند و سپس نتایج را با direnv_load در بر بگیرید.

مثال:

direnv_load opam exec direnv dump

مسیر بسط‌یافتهٔ path را به ابتدای متغیر محیطی PATH اضافه می‌کند. این دستور از اشتباه رایجی که در آن PATH تنها با path جدید جایگزین می‌شود جلوگیری می‌کند.

مثال:

pwd
# output: /home/user/my/project
PATH_add bin
echo $PATH
# output: /home/user/my/project/bin:/usr/bin:/bin

مسیر بسط‌یافتهٔ path را به ابتدای متغیر محیطی MANPATH اضافه می‌کند. این دستور منطق اکتشافی (heuristic) ویژهٔ man را مدیریت می‌کند..SS path_add <varname> <path> مانند PATH_add عمل می‌کند، با این تفاوت که برای یک varname دلخواه است.

دایرکتوری‌هایی را که با هر یک از الگوهای شل داده‌شده مطابقت دارند از متغیر محیطی PATH حذف می‌کند. ترتیب دایرکتوری‌های باقی‌مانده در PATH حاصل حفظ می‌شود.

نحو الگوی Bash:
https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html

مثال:

echo $PATH
# output: /dontremove/me:/remove/me:/usr/local/bin/:...
PATH_rm '/remove/*'
echo $PATH
# output: /dontremove/me:/usr/local/bin/:...

برخی متغیرهای رایج مسیر را برای پیشوندِ prefix_path داده‌شده گسترش می‌دهد. این دستور زمانی مفید است که برنامه‌ای را با استفاده از ./configure --prefix=$prefix_path && make install در prefix_path نصب کرده باشید و بخواهید در پروژه از آن استفاده کنید.

متغیرهای مقداردهی‌شده:

CPATH
LD_LIBRARY_PATH
LIBRARY_PATH
MANPATH
PATH
PKG_CONFIG_PATH

مثال:

./configure --prefix=$HOME/rubies/ruby-1.9.3
make && make install
# Then in the .envrc
load_prefix ~/rubies/ruby-1.9.3

یک دایرکتوری را برای یافتن بالاترین شماره نسخه در قالب SemVer (X.Y.Z) جستجو می‌کند.

مثال‌ها:

$ tree .
.
|-- dir
    |-- program-1.4.0
    |-- program-1.4.1
    |-- program-1.5.0
$ semver_search "dir" "program-" "1.4.0"
1.4.0
$ semver_search "dir" "program-" "1.4"
1.4.1
$ semver_search "dir" "program-" "1"
1.5.0

یک توزیع‌کننده معنایی (semantic dispatch) که برای توصیف ساختارهای رایج پروژه استفاده می‌شود.

مسیر "$(direnv_layout_dir)/go" را به متغیر محیطی GOPATH اضافه می‌کند. و همچنین مسیر "$PWD/bin" را به متغیر محیطی PATH اضافه می‌کند.

متغیر محیطی JULIA_PROJECT را روی دایرکتوری فعلی تنظیم می‌کند.

مسیر "$PWD/node_modules/.bin" را به متغیر محیطی PATH اضافه می‌کند..SS layout opam متغیرهای محیطی را از opam env تنظیم می‌کند.

مسیر "$PWD/vendor/bin" را به متغیر محیطی PATH اضافه می‌کند.

متغیرهای محیطی مورد نیاز local::lib در perl را تنظیم می‌کند. برای جزئیات بیشتر http://search.cpan.org/dist/local-lib/lib/local/lib.pm را ببینید.

مشابه layout python، اما از Pipenv برای ساخت یک virtualenv از روی Pipfile موجود در همان دایرکتوری استفاده می‌کند. این مسیر را می‌توان با متغیر محیطی PIPENV_PIPFILE بازنویسی کرد.

توجه داشته باشید که بر خلاف اجرای دستی Pipenv، این دستور متغیرهای محیطی را به‌طور خودکار از فایل .env بارگذاری نمی‌کند. برای شبیه‌سازی این رفتار می‌توانید dotenv .env را اضافه کنید.

مشابه layout python، اما از pyenv برای ساخت یک virtualenv با نسخهٔ مشخص‌شدهٔ مفسر Python استفاده می‌کند.

می‌توان چندین نسخه را با فاصله از یکدیگر مشخص کرد؛ لطفاً برای اطلاعات بیشتر به مستندات pyenv مراجعه کنید.

یک محیط virtualenv زیر مسیر $PWD/.direnv/python-$python_version ایجاد و بارگذاری می‌کند. این کار نصب هرگونه egg را در زیرپوشهٔ پروژه اجباری می‌کند.

اگر می‌خواهید از نسخه‌های مختلف python استفاده کنید، مشخص کردن فایل اجرایی python امکان‌پذیر است (برای مثال: layout python python3).

توجه داشته باشید که پیش‌تر virtualenv زیر مسیر $PWD/.direnv/virtualenv قرار داشت و در صورت وجود، توسط direnv مجدداً استفاده خواهد شد.

میان‌بری برای layout python python3

متغیر محیطی GEM_HOME را روی $PWD/.direnv/ruby/RUBY_VERSION تنظیم می‌کند. این کار نصب هرگونه gem را در زیرپوشهٔ پروژه اجباری می‌کند. اگر از bundler استفاده می‌کنید، برنامه‌های پوشش‌دهنده‌ای (wrapper) ایجاد می‌کند که می‌توان آن‌ها را مستقیماً و بدون پیشوند bundle exec فراخوانی کرد.

یک اعزام دستور معنایی با هدف بارگذاری وابستگی‌های خارجی در محیط.

مثال:

use_ruby() {
  echo "Ruby $1"
}
use ruby 1.9.3
# output: Ruby 1.9.3

نسخهٔ مشخص‌شدهٔ Julia را بارگذاری می‌کند. باید با استفاده از $JULIA_VERSIONS مسیری را به دایرکتوری حاوی نسخه‌های نصب‌شدهٔ Julia مشخص کنید. می‌توانید به‌صورت اختیاری با استفاده از $JULIA_VERSION_PREFIX پیشوند پوشه‌های درون $JULIA_VERSIONS (پیش‌فرض julia-) را بازنویسی کنید. اگر تطابق دقیقی برای <version> یافت نشود، جستجویی انجام خواهد شد و آخرین نسخه بارگذاری می‌شود.

مثال‌ها (.envrc):

use julia 1.5.1   # loads $JULIA_VERSIONS/julia-1.5.1
use julia 1.5     # loads $JULIA_VERSIONS/julia-1.5.1
use julia master  # loads $JULIA_VERSIONS/julia-master

ابزار rbenv را بارگذاری می‌کند که برنامه‌های پوشش‌دهندهٔ ruby را در PATH در دسترس قرار می‌دهد.

متغیرهای محیطی را از nix-shell بارگذاری می‌کند.

اگر یک default.nix یا shell.nix داشته باشید، به‌طور پیش‌فرض از آن‌ها استفاده خواهد شد، اما همچنین می‌توانید بسته‌ها را مستقیماً مشخص کنید (برای مثال use nix -p ocaml).

ببینید: http://nixos.org/nix/manual/#sec-nix-shell

محیط ساخت یک derivation را مشابه nix develop بارگذاری می‌کند.

به‌طور پیش‌فرض مشخصه devShell از فایل flake.nix پوشه جاری را بارگذاری می‌کند. یا می‌توانید یک «installable» مانند "nixpkgs#hello" ارسال کنید تا تمام وابستگی‌های ساخت بسته hello از آخرین nixpkgs بارگذاری شود.

توجه داشته باشید که ویژگی flakes در پشت یک پرچم آزمایشی پنهان شده است که باید خودتان آن را فعال کنید. Flakes هنوز پایدار در نظر گرفته نمی‌شود..SS use guix [...] بارگذاری متغیرهای محیطی از guix shell.

هر آرگومان داده‌شده به guix shell ارسال خواهد شد. برای مثال، use guix hello محیطی شامل بسته hello را برپا می‌کند. برای ایجاد محیطی به همراه وابستگی‌های hello، پرچم --development استفاده می‌شود: use guix --development hello. گزینه‌های دیگر شامل --file هستند که امکان بارگذاری یک محیط از روی فایل را فراهم می‌کند.

ببینید: https://guix.gnu.org/manual/en/guix.html#Invoking-guix-shell

در صورت نصب بودن rvm، باید دقیقاً مانند محیط شل عمل کند.

نسخه مشخص‌شده NodeJS را در محیط بارگذاری می‌کند.

اگر نسخه ناقصی از NodeJS ارسال شود (مثلاً 4.2)، یک تطبیق تقریبی (fuzzy match) انجام شده و بالاترین نسخه منطبقِ نصب‌شده انتخاب می‌شود.

اگر هیچ نسخه‌ای ارسال نشود، در صورت وجود فایل‌های '.nvmrc' یا '.node-version' در دایرکتوری جاری، آن‌ها را بررسی خواهد کرد.

متغیرهای محیطی:

  • $NODE_VERSIONS (الزامی) به پوشه‌ای اشاره می‌کند که شامل تمام نسخه‌های نصب‌شده Node است. آن پوشه باید وجود داشته باشد.
  • $NODE_VERSION_PREFIX (اختیاری) [پیش‌فرض="node-v"] پیشوند پیش‌فرض نسخه را بازنویسی می‌کند.

اسکریپت vim مشخص‌شده (یا به‌طور پیش‌فرض .vimrc.local) را به ابتدای متغیر محیطی DIRENV_EXTRA_VIMRC اضافه می‌کند.

این متغیر توسط افزونه direnv/direnv.vim شناخته می‌شود. در صورت یافت شدن، پس از باز کردن فایل‌ها در دایرکتوری، آن را سورس (source) می‌کند.

هر فایل را به فهرست نظارت (watch-list) direnv اضافه می‌کند. اگر فایل تغییر کند، direnv در اعلان (prompt) بعدی، محیط را بازخوانی خواهد کرد.

مثال (.envrc):

watch_file Gemfile

بررسی می‌کند که نسخه direnv حداقل به اندازه version_at_least جدید باشد. این می‌تواند هنگام به‌اشتراک‌گذاری یک .envrc و برای اطمینان از به‌روز بودن کاربران مفید باشد.

حالت سخت‌گیرانه اجرای شل را فعال می‌کند. این کار زمینه ارزیابی .envrc را وادار می‌کند در موارد زیر بلافاصله خارج شود:

  • هر دستوری در یک خط لوله وضعیتی غیر از صفر برگرداند که به‌گونه‌ای دیگر به‌عنوان بخشی از آزمون‌های if، while یا until، نقیض مقدار بازگشتی (!) یا بخشی از یک زنجیره بولی (&& یا ||) مدیریت نشده باشد.
  • به هر متغیری که به‌صراحت مقداردهی یا اعلان نشده است (خواه با declare یا local) ارجاع داده شود.

اگر یک خط فرمان به دنبال آن بیاید، سخت‌گیری فقط برای طول مدت اجرای آن دستور اعمال می‌شود.

مثال (کل اسکریپت):

strict_env
has curl

مثال (دستور):

strict_env has curl
سخت‌گیری اجرای پوسته را غیرفعال می‌کند. اگر به دنبال آن یک خط فرمان بیاید، این وضعیت برای مدت‌زمان اجرای همان دستور اعمال می‌شود.
مثال (کل اسکریپت):
unstrict_env
has curl

مثال (دستور):

unstrict_env has curl

اگر درون یک مخزن git با branch_name داده‌شده باشید، مقدار 0 را برمی‌گرداند. اگر نام شاخه‌ای تعیین نشده باشد، در صورت قرار داشتن در هر شاخه‌ای مقدار 0 بازگردانده می‌شود. نیازمند نصب بودن دستور git است. در غیر این صورت مقدار 1 را برمی‌گرداند.

هنگامی که یک شاخه مشخص شده باشد، .git/HEAD رصد می‌شود تا ورود به شاخه یا خروج از آن موجب بارگذاری مجدد شود.

مثال (.envrc):

if on_git_branch child_changes; then
  export MERGE_BASE_BRANCH=parent_changes
fi
if on_git_branch; then
  echo "Thanks for contributing to a GitHub project!"
fi

مجوز MIT - کپی‌رایت (C) 2019 @zimbatm و مشارکت‌کنندگان

direnv(1), direnv.toml(1)

2019 direnv