Shake: Как установить переменную окружения при вызове?

В 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$

1 ответ

Когда ты сказал

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 встроенный

Если вы хотите получить переменную окружения, то ответ @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
    ...
Другие вопросы по тегам