Piz*_*Hut 11 environment-variables go windows-subsystem-for-linux
我正在开发一组使用 .env 文件进行配置的项目,其中每个 .env 文件导出许多环境变量。这些文件的设置如下:
export VARIABLE1=foo
为此,我经常使用 Windows Linux 子系统,但也希望能够在我的 Windows 计算机上运行这些项目。有问题的项目是 Golang。
是否有任何简单的方法可以通过这些 .env 文件以编程方式设置 Windows 环境变量(最好是暂时的)?这些主要是为了我可以在 VSCode 中进行调试。
小智 7
如果您使用的是 Windows,则可以使用 powershell 读取 .env 文件并将 key=value 对加载到应用程序可以读取的会话级环境变量中。将下面的代码放入名为 DotEnvToEnvVars.ps1(或任何您想要的名称)的文件中。然后运行脚本,将路径传递给 .env 文件: C:> ./DotEnvToEnVars.ps1 ./myproject/.env -Verbose
包括可选参数:
-详细查看设置了哪些环境变量
-Remove 删除在该 .env 文件中找到名称的所有环境变量
-RemoveQuotes 在创建环境变量之前,从 .env 中键/值对的值侧去除 " 和 '
param(
[string]$Path,
[switch]$Verbose,
[switch]$Remove,
[switch]$RemoveQuotes
)
$variables = Select-String -Path $Path -Pattern '^\s*[^\s=#]+=[^\s]+$' -Raw
foreach($var in $variables) {
$keyVal = $var -split '=', 2
$key = $keyVal[0].Trim()
$val = $RemoveQuotes ? $keyVal[1].Trim("'").Trim('"') : $keyVal[1]
[Environment]::SetEnvironmentVariable($key, $Remove ? '' : $val)
if ($Verbose) {
"$key=$([Environment]::GetEnvironmentVariable($key))"
}
}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)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
使用 读取 env 文件行bufio.Scanner
。使用包解析行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)
}
}
Run Code Online (Sandbox Code Playgroud)
游乐场:https://play.golang.org/p/pZKQ0GW5eCu
输出:
VARIABLE1 true foo
VARIABLE2 true bar
Run Code Online (Sandbox Code Playgroud)