我有一個基本的“服務單元”檔案,如下所示。
[Unit]
Description=Certprovider service
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=5s
ExecStart=/home/mert/certprovider/certprovider
WorkingDirectory=/home/mert
User=root
Group=root
[Install]
WantedBy=multi-user.target
我在專案的根目錄中有.env檔案。
CA_DIR_URL=https://acme-v02.api.letsencrypt.org/directory
[email protected]
HOST=127.0.0.1
PORT=8557
我用以下幾行加載這個檔案。
err := godotenv.Load()
if err != nil {
log.Fatalln("Error loading .env file")
}
服務一直運行良好,但我無法訪問PORT環境變數。因此我無法啟動網路服務器,因為該埠無法偵聽。我列印了.env 中不包括PORT 的所有環境變數。我把它的名字改成了APP_PORT但也是一樣的。
神秘的部分是我可以訪問.env檔案中的其他變數。除此之外,當我在單元檔案中添加以下行時,我可以訪問該變數,但我不明白為什么我應該只在單元檔案中添加PORT變數?
[Service]
Environment=PORT=8557
當我嘗試將它作為二進制檔案運行時,就會發生這種情況。因為我可以使用以下命令訪問變數。
go run .
uj5u.com熱心網友回復:
如果您在沒有任何引數的情況下呼叫 Load ,它將默認在當前路徑中加載 env。
您當前的路徑在此處配置:
WorkingDirectory=/home/mert
然而,你說(強調)
我在專案的根目錄中有 .env 檔案。
但這不是當前的作業目錄。
專案的根
該概念對應用程式運行時沒有意義。與解釋性語言(例如 PHP)不同,Go 編譯為靜態二進制檔案,該二進制檔案在功能上完全不同于定義它的庫和源集。在 PHP(或 python、ruby 等)中,除了某些專案目錄的根目錄外,這些庫沒有其他位置。
在 Go 中,這些東西只與開發和測驗相關。您的可執行檔案似乎在您的“專案根目錄”中這一事實完全是偶然的,而且完全沒有意義。
如果您真的想將運行時配置放在特定檔案中,在該特定位置,只需將其設定為作業目錄:
ExecStart=/home/mert/certprovider/certprovider
WorkingDirectory=/home/mert/certprovider/certprovider
我會把這些東西放進去,/usr/local這樣我就不會在擺弄我的主目錄中的東西時不小心破壞了我的讓我們加密 - 讓我們加密雙倍如此,因為它可能需要長達 90 天才能意識到您的證書沒有被重繪 。出于同樣的原因,我會將配置放在我的主目錄之外。
實際上,對于這種情況,我可能會將所有配置放在單元檔案中。為什么不把它放在那里?但當然,這是一個意見問題。如果您真的想使用自動.env發現,那么您應該指定一個目錄來包含該隱藏檔案。將特定于一個應用程式的配置放在~/.env.
無論您將 放在何處.env,請確保這是您的作業目錄,以便被發現。
我列印了 .env 中不包括 PORT 的所有環境變數。我把它的名字改成了 APP_PORT 但也是一樣的。[...] 神秘的部分是我可以訪問 .env 檔案中的其他變數。
恕我直言,這聽起來像是你的假設。如果沒有相反的證據,很容易得出結論,您已經為這些值設定了默認值,或者它們來自其他一些來源或行為。這比得出godotenv庫從檔案中讀取一些但不是全部的值更簡潔。
當我嘗試將它作為二進制檔案運行時,就會發生這種情況。因為我可以使用以下命令訪問變數。[
go run .]
Go總是以二進制形式運行。 go run .只需在臨時位置自動構建二進制檔案,然后運行它。 為什么在生產環境中運行 Go 應用程式時建議使用 `go build` 而不是 `go run`?談論為什么go run經常被禁止在 SO 上。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/362226.html
