代码之家  ›  专栏  ›  技术社区  ›  Marco

为什么在Makefile目标中包含生成的.env文件时会出现“拒绝权限”?

  •  0
  • Marco  · 技术社区  · 2 年前

    我需要在目标中重新加载环境文件。因此,我尝试了一个简单的例子,生成一个env文件并尝试将其加载到目标中。我得到的错误是拒绝权限错误。我已经试着设置了 chmod +r 对于env文件,但这并不能解决问题。所以我想知道为什么我得到 permission denied error ?该文件实际上已创建,但未包含在内。

    ENV_FILE := .env
    
    .PHONY: create-env-file
    create-env-file:
        @echo "Generating environment file... $(ENV_FILE)"
        @echo "VAR1=1" > $(ENV_FILE)
        @echo "VAR2=2" >> $(ENV_FILE)
    
    .PHONY: load-env-file
    load-env-file:
        echo "- Reloading env file..."
        $(MAKE) create-env-file
        chmod +r $(ENV_FILE)
        include $(ENV_FILE)
    
    .PHONY: start
    start: load-env-file
        echo $(VAR2)
    

    输出运行

    $make start
    echo "- Reloading env file..."
    - Reloading env file...
    /Library/Developer/CommandLineTools/usr/bin/make create-env-file
    Generating environment file... .env
    chmod +r .env
    include .env
    make: include: Permission denied
    make: *** [load-env-file] Error 1
    
    0 回复  |  直到 2 年前
        1
  •  0
  •   John Bollinger    2 年前

    这个 include GNU声明 make 是对 制作 。它不能在配方中使用,因为配方中的每一行都被解释为要由shell执行的命令。由于shell发现 包括 在可执行文件搜索路径中的某个位置,但无法将其作为命令执行。

    可能是因为你 . 在您的路径中(通常是个坏主意) 包括 在您的项目文件夹中。在这种情况下,我可以复制您的“拒绝权限”错误,但如果没有 包括 在我的 PATH

    你谈论的是 .env 文件,好像这是一件事,但它不是 制作 事物或标准 事情你似乎有意定义 制作 变量或shell变量,但不清楚是哪一个。您对 包括 暗示前者,但这个名字似乎更适合后者。如果你真的是认真的 制作 变量,那么为什么不直接将变量定义放在makefile中呢?

    Docker利用 .env 文件,所以也许这就是你的想法,但(i)加载Docker的内容是完全不合适的 .env 文件为 制作 或shell变量,以及(ii)通过 制作

    在任何情况下, 如果你愿意 制作 为您构建一个文件,然后将该文件作为规则的目标。 如果你真的想 包括 然后为该文件创建一个普通规则,并将 包括 指令在正确的地方,将处理整个问题。示例:

    include .env
    
    all:
            @echo 'VAR1: $(VAR1)'
            @echo 'VAR2: $(VAR2)'
    
    .env:
            @echo "Generating environment file $@ ..."
            @echo "VAR1=1" > '$@'
            @echo "VAR2=2" >> '$@'
    

    这样做是因为 制作 尝试在执行其他操作之前重新生成makefile及其所有依赖项。

    最后,请注意,如果这真的是你想做的,那么 .env 或以句点开头的任何其他名称( )是 可怕的 名称。相反,选择几乎所有默认情况下不会从目录列表中省略的内容。