2017-07-27 22 views
-1

と私はキーを取得するためにyamlファイルスルー読み取りにpkuczynski's Gistを使用しようとしています。以下は読むYAMLはMakefileの

は私がする必要が午前何の試み(S)(多くの)一つです。私はエラーを取得していないが、単に空$(DEVURL)

config.yaml:

baseurl: 
    dev: "https://some-dev-url/" 
    stage: "https://a-staging-url/" 
    prod: "https://production-url" 

のMakefile:

BASEDIR  =$(CURDIR) 
CONFDIR  =$(BASEDIR) 
OUTPUTDIR =$/../build 

DEVDIR  =$(OUTPUTDIR)/dev 
PRODDIR  =$(OUTPUTDIR)/prod 
STAGEDIR =$(OUTPUTDIR)/stage 

DEVCONF  =$(CONFDIR)/config.dev.yml 
PRODCONF =$(CONFDIR)/config.prod.yml 
STAGECONF =$(CONFDIR)/config.stage.yml 
USRCONFIG =$/../usr/config.yml 

dev: 
    . $(BASEDIR)/parse_yaml.sh     # include parse_yaml function 
    $(info $(parse_yaml $(USRCONFIG) 'config_')) # read yaml file 
    $(parse-yaml DEVURL is $(config_baseurl_dev)) # Get the baseurl:dev KEY 
    @echo ${DEVURL}        # Print the DEVURL from KEY 
    sleep 1 
    rm -rfv $(DEVDIR)        # Delete the DEVDIR b4 build 
    sleep 1 
    $(BUILDER) --config=$(DEVCONF) -b=$(DEVURL) # Inset the baseurl:dev KEY 

がparse_yaml.sh:

#!/bin/sh 
parse_yaml() { 
    local prefix=$2 
    local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') 
    sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ 
     -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 | 
    awk -F$fs '{ 
     indent = length($1)/2; 
     vname[indent] = $2; 
     for (i in vname) {if (i > indent) {delete vname[i]}} 
     if (length($3) > 0) { 
     vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")} 
     printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3); 
     } 
    }' 
} 

答えて

0
  1. あなたはメイクレシピの連続したラインが1つのシェルとして実行されていると信じているようです。これはどのように動作するかではなく、各行は別々のシェル呼び出しで実行されます。あなたは

    . $(BASEDIR)/parse_yaml.sh 
    

    を実行するときに、それはあなたのレシピの他の部分には影響を与えません。あなたが1つのシェル呼び出しのコンテキストであなたの完全なレシピを実行したい場合は、1つの行にすべてをかけると;&&または||でコマンドをチェーン。

    レシピはメイクで展開され
    command1 && \ 
    command2 ; \ 
    command3 || \ 
    command4 
    
  2. 、各$を基準として考えられているがを作る:あなたは、読みやすくするため、行継続(行の終了前に最後の文字として\)を使用することができます変数または関数。

    $(parse-yaml DEVURL is $(config_baseurl_dev)) 
    

    を展開するときに、makeが(それはシェル関数ではなく、メイク機能である)が存在しない$(parse-yaml...メイク機能を実行しようとします。したがって、このステートメントは完全に無視されます。あなたが拡張からこれら$兆候の一部を保護したい場合は、それらを倍増:

    $$(parse-yaml DEVURL is $$(config_baseurl_dev)) 
    

    メイクによって展開は、次のようにシェルに渡されます後:あなたが何をしたいから、おそらく近い

    $(parse-yaml DEVURL is $(config_baseurl_dev)) 
    

  3. あなたの変数の定義のいくつかは奇妙です:

    OUTPUTDIR =$/../build 
    

    あなたがリードする$/から何を期待していますか? 、それは少し奇妙である、それはあなたが望むものである場合であっても

    OUTPUTDIR =../build 
    

    :それは未定義であるとして、結果は同じになります、そこ$/という名前の自動メイク変数ではありませんが、とにかくそれを拡大していきます作成​​し、あなたは思いませんか?これを行うための非常に良い理由がある場合を除き、あなたのMakefileの貧しいメンテナに親切にし、それを避けてください。

0

のMakefile

all: 
    $(foreach var,$(shell . $(CURDIR)/parse_yaml.sh; parse_yaml config.yaml 'config_'),$(eval $(var))) 
    $(info config_baseurl__dev is $(config_baseurl__dev)) 
    $(info config_baseurl__stage is $(config_baseurl__stage)) 
    $(info config_baseurl__prod is $(config_baseurl__prod)) 

結果は以下です。

make 
config_baseurl__dev is "https://some-dev-url/" 
config_baseurl__stage is "https://a-staging-url/" 
config_baseurl__prod is "https://production-url" 
関連する問題