【问题标题】:Include multiple .env files in one Makefile在一个 Makefile 中包含多个 .env 文件
【发布时间】:2021-04-20 18:20:04
【问题描述】:

当谈到在 Makefile 中加载环境变量时,大多数答案都指向这样做:

include .env.dev
export $(shell sed 's/=.*//' .env.dev)

其中.env.dev是一个包含我的环境变量的文件,例如:

FOO=bar
SQL_DATABASE=mydb_dev

但是,我有两个.env 文件,一个用于生产,一个用于开发。似乎不可能将此include 命令放在make 命令中,也不能放在变量中。我最理想的是有一个Makefile,类似于:

include config/.env.django.dev
export $(shell sed 's/=.*//' config/.env.django.dev)

serve-dev:
    - npm run dev

build-prod:
    - npm run build

运行make serve-dev 将首先从文件.env.dev 加载变量,但运行make build-prod 将首先从文件.env.prod 加载变量。许多变量有相同的键但不同的值,所以我不能同时加载。

这里有什么好的方法?

【问题讨论】:

    标签: linux makefile environment-variables


    【解决方案1】:

    我看到两个选项:

    • 将变量加载代码放在配方中,用$(eval ...) 包裹。

      缺点是,如果您出于某种原因需要这些变量,则在输入配方之前您将无法访问这些变量。

      serve-dev:
          $(eval include include .env.dev)
          $(eval export $(shell sed 's/=.*//' .env.dev))
      
    • 将变量加载代码包装在 ifneq ($(filter serve-dev,$(MAKECMDGOALS)),) ... endif 之类的东西中。

      这将使变量可以在任何地方访问,只有在使用命令行标志指定目标时才会起作用,而不是构建为其他目标的依赖项。

      ifneq ($(filter serve-dev,$(MAKECMDGOALS)),)
      include config/.env.django.dev
      export $(shell sed 's/=.*//' config/.env.django.dev)
      endif
      

    【讨论】:

    • 有没有机会添加一个例子来说明你的意思?基于此,我无法完全理解。我可以在单一配方的范围内做事。
    • 不错!就是这样:) 谢谢@HolyBlackCat
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多