【问题标题】:Using .env files to set environment variables in Windows在 Windows 中使用 .env 文件设置环境变量
【发布时间】:2018-07-14 09:47:28
【问题描述】:

我正在开发一组使用 .env 文件进行配置的项目,其中每个 .env 文件都导出许多环境变量。文件设置如下;

export VARIABLE1=foo

为此我经常使用 Windows Linux 子系统,但也希望能够在我的 Windows 机器上运行这些项目。有问题的项目是 Golang。

是否有任何简单的方法可以从这些 .env 文件中以编程方式设置 Windows 环境变量(最好是临时的)?这些主要是为了让我可以在 VSCode 中进行调试。

【问题讨论】:

  • 请说明.env 是如何准确加载的。 Go 本身不处理 .env,您可能正在使用 godotenv。它为当前进程设置环境变量(如果将其用作库)并且可能在 Windows 上工作。如果你在运行 go 程序之前获取.env,那么这就更加超然,与 Go 无关。
  • 抱歉忘记了那部分。通常在 linux/bash 环境中,我只是 source foo.env,它会在文件中加载环境变量。这不一定是 Go 特有的,只是我必须在 Go 应用程序中使用这种方法。
  • 好的,那么上周提到的 Godotenv 就为你准备好了,无论是在 Linux 还是 Windows 中。
  • direnv 会这样做,尽管它默认使用 .envrc。不确定这是否可以更改。

标签: go environment-variables windows-subsystem-for-linux


【解决方案1】:

我使用了 godotenv 库。

将配置值添加到项目根目录下的 .env 文件中:

PORT=8080
NAME=FlowAPI

ma​​in.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)
    }
}

【讨论】:

    【解决方案2】:

    Package os

    import "os"
    
    func Clearenv()
    func Environ() []string
    func Expand(s string, mapping func(string) string) string
    func ExpandEnv(s string) string
    func Getenv(key string) string
    func Setenv(key, value string) error
    func Unsetenv(key string) error
    

    使用 bufio.Scanner 读取 env 文件行。使用 strings 包解析行。使用os包环境变量函数。

    例如,

    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)
        }
    }
    

    游乐场:https://play.golang.org/p/pZKQ0GW5eCu

    输出:

    VARIABLE1 true foo
    VARIABLE2 true bar
    

    【讨论】:

    • 是的,看来我可能不得不走这条路,只是希望已经有一些事情发生了。为提示干杯。
    • @PizzaTheHut:看起来并不难!有关概念验证,请参阅我修改后的答案。在 Windows 10 和 Ubuntu 17.10 上测试。
    【解决方案3】:

    创建一个名为“.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)
    

    【讨论】:

    • 问题是针对 golang 特定的答案。
    猜你喜欢
    • 2021-05-16
    • 2022-07-20
    • 1970-01-01
    • 2021-08-19
    • 2017-09-02
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多