Shake: Как установить переменную окружения при вызове? - PullRequest
0 голосов
/ 01 декабря 2018

В Makefile можно ссылаться на аргументы, заданные в командной строке во время вызова make.Например, рецепт в правиле может включать команду python/subsample.py $(subsample_size), которая вызывается в командной строке, набирая что-то вроде make subsample subsample_size=0.1.

Я хотел бы сделать то же самое с shake.Я написал следующее правило:

phony "echoEnvVar" $ do
    ev <- fromMaybe "undefined" <$> getEnv "ev"
    liftIO $ putStrLn ev

Проблема в том, что shake рассматривает определение командной строки для переменной ev как другую цель:

jeff@jeff-ThinkCentre-M700:~/shake-studies$ stack exec  ./build.sh echoEnvVar ev=whatever
Error when running Shake build system:
* ev=whatever
Error, file does not exist and no rule available:
  ev=whatever
CallStack (from HasCallStack):
  error, called at src/Development/Shake/Internal/Rules/File.hs:180:58 in shake-0.16.4-7UipAYwzJlKKX7fQ0hMQ1b:Development.Shake.Internal.Rules.File

Если я вместо этого вызываю это правило без аргументов командной строки, оно ведет себя как ожидалось:

jeff@jeff-ThinkCentre-M700:~/shake-studies$ stack exec  ./build.sh echoEnvVar
undefined
Build completed in 0:01m
jeff@jeff-ThinkCentre-M700:~/shake-studies$

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Если вы хотите получить переменную окружения, тогда ответ @ HTNW точен.

Если вам действительно нужны параметры конфигурации, доступные в программе, то вы можете использовать shakeArgsWith.Как пример:

import System.Console.GetOpt

flags = [Option "" ["subsample_size"] (ReqArg readEither) "Set the subsample size (in %)."]

main = shakeArgsWith shakeOptions flags $ \flags targets -> return $ Just $ do
    -- now flags will contain a list of the passed subsample_size values
    ...
0 голосов
/ 02 декабря 2018

Когда вы говорите

make subsample subsample_size=0.1

Вы вызываете make с двумя аргументами: subsample и subsample_size=0.1, и в той же среде, в которой находится остальная часть вашей оболочки. make распознает, чтоsubsample_size=0.1 имеет форму var=value, и это интерпретирует это как макроопределение.Это имеет тот же эффект, что и установка переменной среды.Shake не поддерживает получение определений в командной строке, поэтому вы должны на самом деле установить переменную среды.

Способ установки переменной среды для Shake будет зависеть от того, какую программу вы используете длявыполнить Shake.Вы вызываете Shake через build.sh.Предполагая, что это не делает ничего интересного, скрипт передаст Shake свою собственную среду без изменений.Вы вызываете build.sh - stack exec, который также передаст вашу переменную из ее собственной среды без изменений (но она изменит некоторые другие переменные).Вы вызываете stack exec через свою собственную оболочку.Предполагая, что это оболочка POSIX, вы можете написать

ev="Hello World!" stack exec ./build.sh echoEnvVar

, чтобы установить переменную окружения ev во время вызова на stack.Вы также можете использовать export встроенный .

...