Go 使用.env文件在Windows中设置环境变量
我正在处理一组使用.env文件进行配置的项目,其中每个.env文件都会导出许多环境变量。文件设置如下:Go 使用.env文件在Windows中设置环境变量,go,environment-variables,windows-subsystem-for-linux,Go,Environment Variables,Windows Subsystem For Linux,我正在处理一组使用.env文件进行配置的项目,其中每个.env文件都会导出许多环境变量。文件设置如下: export VARIABLE1=foo 为此,我经常使用Windows Linux子系统,但也希望能够在我的Windows机器上运行这些项目。正在讨论的项目是Golang 是否有任何简单的方法可以通过编程从这些.env文件设置Windows环境变量(最好是临时设置)?这主要是为了在VSCode中调试 使用bufio.Scanner读取环境文件行。使用字符串包分析行。使用ospackage环
export VARIABLE1=foo
为此,我经常使用Windows Linux子系统,但也希望能够在我的Windows机器上运行这些项目。正在讨论的项目是Golang
是否有任何简单的方法可以通过编程从这些.env文件设置Windows环境变量(最好是临时设置)?这主要是为了在VSCode中调试
使用bufio.Scanner
读取环境文件行。使用字符串
包分析行。使用os
package环境变量函数
比如说,
package main
import (
"bufio"
"bytes"
"fmt"
"io"
"os"
"strings"
)
func parseLine(line string) (key, value string) {
line = strings.TrimSpace(line)
const export = `export `
if !strings.HasPrefix(line, export) {
return "", ""
}
line = strings.TrimPrefix(line, export)
fields := strings.SplitN(line, "=", 2)
if len(fields) > 0 {
key = strings.TrimSpace(fields[0])
if len(fields) > 1 {
value = strings.TrimSpace(fields[1])
}
}
return key, value
}
func setenv(r io.Reader) error {
s := bufio.NewScanner(r)
for s.Scan() {
line := s.Text()
key, value := parseLine(line)
if len(key) < 1 {
continue
}
err := os.Setenv(key, value)
if err != nil {
return err
}
}
if err := s.Err(); err != nil {
return err
}
return nil
}
func main() {
envFile := bytes.NewBufferString(
"export VARIABLE1=foo\r\nexport VARIABLE2=bar\n",
)
err := setenv(envFile)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
for _, key := range []string{`VARIABLE1`, `VARIABLE2`} {
env, found := os.LookupEnv(key)
fmt.Println(key, found, env)
}
}
我用过哥多涅夫图书馆 将配置值添加到项目根目录下的.env文件中:
PORT=8080
NAME=FlowAPI
main.go
package main
import (
"log"
"github.com/joho/godotenv"
"fmt"
"os"
)
func init() {
// loads values from .env into the system
if err := godotenv.Load(); err != nil {
log.Print("No .env file found")
}
}
func main() {
// Get the PORT environment variable
port, exists := os.LookupEnv("PORT")
if exists {
fmt.Println(port)
}
}
创建一个名为“.env”的文本文件(实际上,我想你可以随意调用它,但这样做会使它变得简短和描述性)。将此文件放在您选择的任何文件夹中。。。远离您可能公开的任何Python代码,例如GitHub、GitLab等。例如,我的代码位于“e:/Python/EnvironmentVariables/.env”
在您喜爱的文本编辑器中编辑文件,并创建您的秘密。如果您愿意,您可以将您所有项目的所有机密都保存在这个文件中,[标题]是可选的,并且仅为您的利益。确保所有键名称都不同-如果希望,请将项目名称添加到开头或结尾:
[MyProject]
MyUsername="Fred Bloggs"
MyEmail="fred@example.com"
MyPassword="fvghtyu7i890ol"
[MyOtherProject]
MyAPIKey_MyOtherProject="FMu4ejyK-qQLBasTs7iHx*SFN5fF"
email_port=110
DEBUG=True
现在在您的python程序中,在任何项目中都可以访问您想要的任何秘密
import os
from dotenv import load_dotenv
load_dotenv("E:/Python/EnvironmentVariables/.env")
USER_NAME = os.getenv("MyUsername")
API_KEY = os.getenv("MyAPIKey_MyOtherProject")
print(USER_NAME, API_KEY)
请澄清如何准确加载
.env
。Go不会以本机方式处理.env
,您可能正在使用。它为当前进程设置环境变量(如果将其用作库),并且可能在windows上工作。如果您在运行go程序之前正在寻找.env
,那么这将更加独立,与go无关。很抱歉,您忘记了这一部分。通常在linux/bash环境中,我只需source foo.env
,它将环境变量加载到文件中。这并不一定是特定于Go的,只是我必须在Go应用程序中使用这种方法。好的,那么Godotenv上周提到了这一点,所以所有这些都适用于Linux和windows。尽管默认情况下它使用.envrc,但仍会执行此操作。我不确定这是否可以改变。是的,看起来我可能不得不走这条路,只是希望已经有一些事情在发生了。为这个提示干杯。@PizzaTheHut:看起来并不难!有关概念证明,请参阅我的修订答案。在Windows10和Ubuntu17.10上测试。问题是针对golang的特定答案。
[MyProject]
MyUsername="Fred Bloggs"
MyEmail="fred@example.com"
MyPassword="fvghtyu7i890ol"
[MyOtherProject]
MyAPIKey_MyOtherProject="FMu4ejyK-qQLBasTs7iHx*SFN5fF"
email_port=110
DEBUG=True
import os
from dotenv import load_dotenv
load_dotenv("E:/Python/EnvironmentVariables/.env")
USER_NAME = os.getenv("MyUsername")
API_KEY = os.getenv("MyAPIKey_MyOtherProject")
print(USER_NAME, API_KEY)