Настраиваемые поля, которые каким-то образом попадают в buildHook? - PullRequest
0 голосов
/ 05 мая 2020

Я хотел бы передать некоторые настраиваемые конфигурации для каждого исполняемого файла / библиотеки (в идеале целый пакет пар ключ-значение, но как минимум один String) из моего файла .cabal полностью в Setup.hs s buildHook.

Для справки, параметры buildHook:

buildHook 
    :: PackageDescription 
    -> LocalBuildInfo
    -> UserHooks
    -> BuildFlags -> IO ()

Так что я надеюсь на что-то в PackageDescription library / executables поле, которое дает мне доступ к настраиваемым полям, не прерывая всех других фаз Кабала, которые я мог бы поместить в файл .cabal. Вот выдуманный пример, который в основном был бы настолько хорош, насколько это возможно:

...

executable my-exe
  main-is: my-main.hs
  ...
  plugin-args:
    myplugin:
      foo: bar
      baz: quux 

, чтобы я мог получить все myplugin пары ключ / значение, чтобы получить "foo" |-> "bar", "baz" |-> "quux" в какой-то ассоциативной структуре данных, например HashMap.

Обратите внимание, что я уже совершаю жестокое насилие в моем Setup.hs, поэтому любые хакерские предложения приветствуются. При необходимости я могу переопределить ВСЕ Setup.hs хуки, чтобы игнорировать некоторые настройки во всем, кроме buildHook, если это необходимо для какого-то решения.

1 Ответ

0 голосов
/ 05 мая 2020

Хотя я не нашел его в пользовательской документации, есть этот слепок в типе BuildInfo :

customFieldsBI :: [(String, String)]

Пользовательские поля, начинающиеся с x-, хранится в простом asso c -списке.

Итак, оказывается, вы можете написать

...
executable my-exe
  main-is: my-main.hs
  ...
  plugin-args:
    x-myplugin: foo

, а затем получить к нему доступ с помощью lookup "x-myplugin" . view customFieldsBI :: (HasBuildInfo bi) => bi -> Maybe String.

В частности, Executable и Library имеют HasBuildInfo экземпляров, поэтому вы можете просто пройти через PackageDescription в buildHook и обработать их String значение там.

...