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
...