web-dev-qa-db-ja.com

Makefileの.envファイルから変数をロードおよびエクスポートする方法

Makefileで.envを使用する、つまりそのファイルをロードしてmakeのサブシェルのすべての変数をエクスポートする最良の方法は何ですか?

提案されたソリューションがmakeのみで機能する場合は、すばらしいでしょう。サードパーティのツールを使用していません。また、.envファイルは、次のような複数行の変数をサポートしています。

FOO="this\nis\na\nmultiline\nvar"

これが このソリューション がおそらく適切でない理由です。

11
Bastian Venthur

Makeは、ファイルの内容を変数に読み込む方法を提供していません。したがって、外部ツールを使用せずに結果を達成することは不可能だと思います。しかし、私が間違っている場合は、新しいトリックを教えていただければ幸いです。

したがって、技術的に正しいシェルファイルである.envの2つのファイルがあると仮定します。

FOO=bar

BAR="notfoo" # comment
   #comment
MULTILINE="This\nis\nSparta!"
# comment

およびscript.sh

#!/bin/bash
echo FOO=${FOO}
echo BAR=${BAR}
echo -e ${MULTILINE}

1つの解決策は、.envファイルを含めて、変数がエクスポートされていることを確認することです。

include .env

$(eval export $(Shell sed -ne 's/ *#.*$//; /./ s/=.*$$// p' .env))

all:
    ./script.sh

Shellとmakeでは引用符の扱いが異なるため、出力には引用符が表示されます。

Makeで変数を再処理することでそれを回避できます。

include .env

VARS:=$(Shell sed -ne 's/ *\#.*$$//; /./ s/=.*$$// p' .env )
$(foreach v,$(VARS),$(eval $(Shell echo export $(v)="$($(v))")))

all:
    ./script.sh

しかしその後、複数行の変数はワンライナーになります。

最後に、bashで処理する一時ファイルを生成し、コマンドを実行する前にそのファイルを読み込むことができます。

Shell=bash

all: .env-export
    . .env-export && ./script.sh

.env-export: .env
    sed -ne '/^export / {p;d}; /.*=/ s/^/export / p' .env > .env-export

ああ、この場合、複数行変数で新しい行がめちゃくちゃになりました。さらに引用する必要があります。

最後に、上記のexportコマンドを使用してsedを.envに追加し、次のようにします。

Shell=bash
%: .env-export
    . .env-export && make -f secondary "$@"
3
ArturFH