Golang os.Getenv (key) возвращает весь файл env, а не только значение ключа - PullRequest
0 голосов
/ 09 июля 2020

Я разработчик, который недавно перешел с macOS на WSL2 на Windows 10. Мне наконец удалось заставить все работать, но когда я вызываю лямбду локально через Docker, функция os.Getenv () возвращает весь мой файл env, а не только один ключ.

То, что я пробовал:

  • Установить "files.eol" = "\ n" в настройках vscode. json
  • Установить core.autocrlf = input in git config --global
  • Set eol = lf in git config --global

I Я был в тупике целую вечность и не мог найти никаких решений в Интернете. Любая помощь была бы очень признательна!

Edit: Извините, я должен был предусмотреть возможность опубликовать код и env. необходимо для репликации проблемы

////////////
// Code:  //
////////////

func init() {
    if err := config.Load(); err != nil {
        api.ReportError(err)
    }
    dbo = db.Instance{
        DSN: os.Getenv("DBReadDataSourceName"),
    }
    log.Println("DSN: ", dbo.DSN)
}

// Load ...
func Load() error {
    stage := os.Getenv("Stage")
    log.Println("stage: ", stage)

    if len(data) <= 0 && stage != "local" {
        log.Println("stage != local")
        log.Println("do production config and ssm stuff")
    }

    return nil
}


//////////
// Env: //
//////////

Stage=local
ServerPort=:1234
DBDriverName=mysql
DBReadDataSourceName=MySQLReadDataSourceCredentials
DBWriteDataSourceName=MySQLWriteDataSourceCredentials
RiakAddress=RiakAddress
RedisAddress=RedisAddress
ElasticSearchUrl=ElasticSearchUrl
ElasticSearchPrefix=ElasticSearchPrefix
ThidPartyBaseURL=https://api-sandbox.ThirdParty.com
ThidPartyCountryCode=SG
ThidPartyClientID=asdf12345qwertyuiadsf
ThidPartyClientSecret=asdf12345qwertyuiadsf


/////////////
// Output: //
/////////////

2020/07/13 17:04:03 stage:  local
ServerPort=:1234
DBDriverName=mysql
DBReadDataSourceName=MySQLReadDataSourceCredentials
DBWriteDataSourceName=MySQLWriteDataSourceCredentials
RiakAddress=RiakAddress
RedisAddress=RedisAddress
ElasticSearchUrl=ElasticSearchUrl
ElasticSearchPrefix=ElasticSearchPrefix
ThidPartyBaseURL=https://api-sandbox.ThirdParty.com
ThidPartyCountryCode=SG
ThidPartyClientID=asdf12345qwertyuiadsf
ThidPartyClientSecret=asdf12345qwertyuiadsf
2020/07/13 17:04:03 stage != local
2020/07/13 17:04:03 do production config and ssm stuff
2020/07/13 17:04:03 DSN:  DBReadDataSourceName

Когда я запускаю эту лямбду локально на ma c, os.Getenv () функционирует должным образом, возвращая local для Stage и возвращая MySQLReadDataSourceCredentials для DBReadDataSourceName . Однако запуск этой лямбды локально через WSL2 на машине windows приводит к приведенному выше выводу. Stage возвращает весь файл, а DBReadDataSourceName возвращает DBReadDataSourceName.

Я в полном тупике и перепробовал все, что мог придумать, в том числе вручную написать \ r \ n в конце каждого env. стоимость. Любая помощь будет очень признательна! Большое спасибо за ваше время

Edit 2: Из комментариев

Команда, которую я использовал для загрузки env. файл имеет вид env -S "`cat env.local`" sam local start-api --template template.yaml --profile company_local, где env.local является именем файла.

Команда env -S $'a=5\nb=6' sh -c 'echo "$a"' печатает

5
b=6

Команда env -S $'a=5\r\nb=6' sh -c 'echo "$a"' печатает точно такой же результат, как указано выше,

5
b=6

Команда env -S 'a=5;b=6' sh -c 'echo "$a"' печатает

5;b=6

И env -S 'a=5:b=6' sh -c 'echo "$a"' печатает

5:b=6

И команда xxd env.local | head -n 3 печатает

00000000: 5374 6167 653d 6c6f 6361 6c0a 5365 7276  Stage=local.Serv
00000010: 6572 506f 7274 3d3a 3132 3334 0a44 4244  erPort=:1234.DBD
00000020: 7269 7665 724e 616d 653d 6d79 7371 6c0a  riverName=mysql.
...