Jak ustawić zmienną środowiskową procesu potomnego w pliku Makefile

Chciałbym zmienić ten Makefile:

SHELL := /bin/bash
PATH  := node_modules/.bin:$(PATH)

boot:
    @supervisor         \
      --harmony         \
      --watch etc,lib       \
      --extensions js,json      \
      --no-restart-on error     \
        lib

test:
    NODE_ENV=test mocha         \
      --harmony             \
      --reporter spec       \
        test

clean:
    @rm -rf node_modules

.PHONY: test clean

Do:

SHELL := /bin/bash
PATH  := node_modules/.bin:$(PATH)

boot:
    @supervisor         \
      --harmony         \
      --watch etc,lib       \
      --extensions js,json      \
      --no-restart-on error     \
        lib

test: NODE_ENV=test
test:
    mocha                   \
      --harmony             \
      --reporter spec       \
        test

clean:
    @rm -rf node_modules

.PHONY: test clean

Niestety drugi nie działa (proces węzła nadal działa z domyślnym NODE_ENV.

Co mnie ominęło?
Author: Victor Sergienko, 2014-05-24

4 answers

Make zmienne nie są eksportowane do środowiska procesów make wywołania... domyślnie. Możesz jednak użyć make ' S export, aby zmusić ich do tego. Zmiana:

test: NODE_ENV = test

Do tego:

test: export NODE_ENV = test

(zakładając, że masz wystarczająco nowoczesną wersję GNU make > = 3.77 ).

 167
Author: MadScientist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-02 22:56:05

Jak zauważył MadScientist, można eksportować poszczególne zmienne za pomocą:

export MY_VAR = foo  # Available for all targets

Lub eksport zmiennych dla określonego celu ( zmienne specyficzne dla celu):

my-target: export MY_VAR_1 = foo
my-target: export MY_VAR_2 = bar
my-target: export MY_VAR_3 = baz

my-target: dependency_1 dependency_2
  echo do something

Możesz również określić cel .EXPORT_ALL_VARIABLES-zgadłeś!- WYEKSPORTUJ WSZYSTKO!!!:

.EXPORT_ALL_VARIABLES:

MY_VAR_1 = foo
MY_VAR_2 = bar
MY_VAR_3 = baz

test:
  @echo $$MY_VAR_1 $$MY_VAR_2 $$MY_VAR_3

Zobacz .EXPORT_ALL_VARIABLES

 108
Author: Shammel Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-28 18:43:05

Potrzebowałem tylko lokalnych zmiennych środowiskowych, aby wywołać moje polecenie test, oto przykład ustawiania wielu zmiennych środowiskowych w powłoce bash i unikania znaku dolara w make.

SHELL := /bin/bash

.PHONY: test tests
test tests:
    PATH=./node_modules/.bin/:$$PATH \
    JSCOVERAGE=1 \
    nodeunit tests/
 17
Author: ThorSummoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 01:24:58

Napisałbym ponownie oryginalny test docelowy, dbając o to, aby potrzebna zmienna została zdefiniowana w tym samym pod-procesie, co aplikacja do uruchomienia:

test:
    ( NODE_ENV=test mocha --harmony --reporter spec test )
 3
Author: Guiyo M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-03 17:16:04