使用.env文件在Windows中设置环境变量

时间:2018-02-04 10:53:15

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

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

{{1}}

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

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

3 个答案:

答案 0 :(得分:1)

我使用了godotenv库。

将配置值添加到项目根目录下的 .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)
    }
}

答案 1 :(得分:0)

  

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

答案 2 :(得分:0)

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