مدیریت متغیرهای محیطی
استفاده از دستور make run/api برای اجرای application API ما فرصتی را برای تنظیم flagهای خط فرمان و حذف مقدار پیشفرض DSN دیتابیس از فایل main.go فراهم میکند. به این صورت:
package main ... func main() { var cfg config flag.IntVar(&cfg.port, "port", 4000, "API server port") flag.StringVar(&cfg.env, "env", "development", "Environment (development|staging|production)") // Use the empty string "" as the default value for the db-dsn command-line flag, // rather than os.Getenv("GREENLIGHT_DB_DSN") like we were previously. flag.StringVar(&cfg.db.dsn, "db-dsn", "", "PostgreSQL DSN") ... }
در عوض، میتوانیم makefile خود را بهروزرسانی کنیم تا مقدار DSN از متغیر محیطی GREENLIGHT_DB_DSN بهعنوان بخشی از rule ارسال شود. اگر قصد دارید همراه با ما پیش بروید، لطفاً rule run/api را به شرح زیر بهروزرسانی کنید:
... ## run/api: run the cmd/api application .PHONY: run/api run/api: go run ./cmd/api -db-dsn=${GREENLIGHT_DB_DSN} ...
این یک تغییر کوچک اما واقعاً خوب است، زیرا به این معنی است که مقادیر پیکربندی پیشفرض application ما دیگر بسته به محیط اجرا تغییر نمیکنند. مقادیر flagهای خط فرمان که در زمان اجرا ارسال میشوند، تنها مکانیزم برای پیکربندی تنظیمات application ما هستند، و همچنان هیچ رازی در فایلهای پروژه ما بهصورت hardcoded وجود ندارد.
در طول توسعه، اجرای application ما همچنان ساده و آسان است — تنها کاری که باید انجام دهیم تایپ make run/api است، به این صورت:
$ make run/api go run ./cmd/api -db-dsn=postgres://greenlight:pa55word@localhost/greenlight time=2023-09-10T10:59:13.722+02:00 level=INFO msg="database connection pool established" time=2023-09-10T10:59:13.722+02:00 level=INFO msg="starting server" addr=:4000 env=development
استفاده از فایل .envrc
اگر مایل باشید، میتوانید متغیر محیطی GREENLIGHT_DB_DSN را از فایلهای $HOME/.profile یا $HOME/.bashrc خود حذف کنید و آن را بهجای آن در یک فایل .envrc در ریشه پروژه خود ذخیره کنید.
اگر قصد دارید همراه با ما پیش بروید، یک فایل .envrc جدید به این صورت ایجاد کنید:
$ touch .envrc
export GREENLIGHT_DB_DSN=postgres://greenlight:pa55word@localhost/greenlight
سپس میتوانید از ابزاری مانند direnv برای بارگذاری خودکار متغیرها از فایل .envrc به shell فعلی خود استفاده کنید، یا بهعنوان جایگزین، میتوانید یک دستور include در بالای Makefile خود اضافه کنید تا آنها را بارگذاری کنید. به این صورت:
# Include variables from the .envrc file include .envrc ## help: print this help message .PHONY: help help: @echo 'Usage:' @sed -n 's/^##//p' ${MAKEFILE_LIST} | column -t -s ':' | sed -e 's/^/ /' ...
این روش بهویژه در پروژههایی که نیاز به تغییرات مکرر در متغیرهای محیطی خود دارید مناسب است، زیرا به این معنی است که میتوانید فقط فایل .envrc را ویرایش کنید بدون اینکه نیاز به ریاستارت کامپیوتر یا اجرای source پس از هر تغییر داشته باشید.
یکی دیگر از مزایای خوب این روش این است که جدایی مناسبی بین متغیرها ایجاد میکند اگر روی پروژههای متعددی روی یک ماشین کار میکنید.
در چند فصل آینده ما شروع به کنترل نسخه کدپایس خود با Git میکنیم، بنابراین بیایید از قبل یک قانون ignore اضافه کنیم تا فایل .envrc هرگز commit نشود.
$ echo '.envrc' >> .gitignore