Как изменить конфигурацию (buildOptions) зависимости в файле конфигурации DUB?
Предположим, у меня есть проект под названием "myapp", и это зависит от "sdlang-d". Я хочу построить свой проект как релиз-отладку, используя dub build --build=release-debug
из командной строки. Из-за проблемы SDLang #54 я не могу собрать sdlang-d как release-debug, поэтому я хочу использовать свой файл конфигурации dub, чтобы заставить sdlang-d собираться как "debug" или "debugMode" независимо от того, когда сборка Я выбираю вариант "myapp", а затем связываю отладочную версию sdlang-d с версией выпуска myapp (чтобы мой код за пределами sdlang-d мог выиграть от оптимизации).
Для целей тестирования я создал проект для github под названием "dub_dependency_config", чтобы смоделировать эту ситуацию. В следующем тексте я предоставлю конкретный вывод, который я наблюдал из вещей, которые я пробовал, поэтому я буду ссылаться на "dub_dependency_config" вместо "myapp".
Я начинаю с простого конфигурационного файла dub.sdl...
// dub.sdl
name "dub_dependency_config"
description "Example of configuring dependencies in dub.sdl."
authors "chadjoan"
copyright "Copyright © 2017, cjoan"
license "BSL-1.0"
dependency "sdlang-d" version="~>0.10.1"
... и попытаться скомпилировать его с dub build --build=release-debug
и, конечно, выпуск № 54 делает свое дело:
C:\dprojects\dub_dependency_config>dub build --build=release-debug
Performing "release-debug" build using dmd for x86_64.
libinputvisitor 1.2.2: target for configuration "library" is up to date.
taggedalgebraic 0.10.7: target for configuration "library" is up to date.
sdlang-d 0.10.1: building configuration "library"...
..\..\Users\cjoan\AppData\Roaming\dub\packages\sdlang-d-0.10.1\sdlang-d\src\sdlang\lexer.d(1273,41): Deprecation: function std.datetime.TimeZone.getTimeZone is deprecated - Use PosixTimeZone.getTimeZone or WindowsTimeZone.getTimeZone instead
..\..\Users\cjoan\AppData\Roaming\dub\packages\sdlang-d-0.10.1\sdlang-d\src\sdlang\ast.d(680,21): Error: null dereference in function _D6sdlang3ast3Tag16getTagAttributesMFAyaAyaZS6sdlang3ast3Tag146__T11MemberRangeTC6sdlang3ast9AttributeVAyaa13_616c6c41747472696275746573VAyaa17_617474726962757465496e646963696573VAyaa11_5f61747472696275746573Z11MemberRange
dmd failed with exit code 1.
Чтобы обойти это, я ожидал, что смогу написать что-то вроде этого:
// dub.sdl
name "dub_dependency_config"
description "Example of configuring dependencies in dub.sdl."
authors "chadjoan"
copyright "Copyright © 2017, cjoan"
license "BSL-1.0"
dependency "sdlang-d" version="~>0.10.1" {
buildOptions "debugMode"
}
Я не ожидал, что это действительно сработает; в документации ничего не сказано Я все равно попробовал, и даб, кажется, игнорирует buildOptions
тег в пределах dependency
тег. Конфигурационный файл становится эквивалентным предыдущему, и я получаю ту же ошибку компиляции #54 проблемы.
Я читал о subConfiguration, которая, кажется, является рекомендуемым способом решения этой проблемы, как упомянуто в этой теме. subConfiguration
дал мне много неудачных конфигураций, чтобы испытать. Давайте рассмотрим несколько:
// dub.sdl
name "dub_dependency_config"
description "Example of configuring dependencies in dub.sdl."
authors "chadjoan"
copyright "Copyright © 2017, cjoan"
license "BSL-1.0"
dependency "sdlang-d" version="~>0.10.1"
configuration "application" {
targetType "executable"
targetName "bin/app"
mainSourceFile "source/app.d"
}
configuration "sdlang-hax" {
buildOptions "debugMode"
}
subConfiguration "sdlang-d" "sdlang-hax"
Этот дает:
C:\dprojects\dub_dependency_config>dub build --build=release-debug
## Warning for package dub_dependency_config, configuration sdlang-hax ##
The following compiler flags have been specified in the package description
file. They are handled by DUB and direct use in packages is discouraged.
Alternatively, you can set the DFLAGS environment variable to pass custom flags
to the compiler, or use one of the suggestions below:
debugMode: Call DUB with --build=debug
Could not resolve configuration for package dub_dependency_config
Так что он не мог понять, что я имел в виду, и в качестве утешительного приза я получаю неприятное сообщение, от которого не могу избавиться;)
Onwards!
// dub.sdl
name "dub_dependency_config"
description "Example of configuring dependencies in dub.sdl."
authors "chadjoan"
copyright "Copyright © 2017, cjoan"
license "BSL-1.0"
dependency "sdlang-d" version="~>0.10.1"
configuration "application" {
targetType "executable"
targetName "bin/app"
mainSourceFile "source/app.d"
subConfiguration "sdlang-d" "sdlang-hax"
}
configuration "sdlang-hax" {
buildOptions "debugMode"
}
Выход:
C:\dprojects\dub_dependency_config>dub build --build=release-debug
## Warning for package dub_dependency_config, configuration sdlang-hax ##
The following compiler flags have been specified in the package description
file. They are handled by DUB and direct use in packages is discouraged.
Alternatively, you can set the DFLAGS environment variable to pass custom flags
to the compiler, or use one of the suggestions below:
debugMode: Call DUB with --build=debug
Performing "release-debug" build using dmd for x86_64.
dub_dependency_config ~master: target for configuration "sdlang-hax" is up to date.
C:\dprojects\dub_dependency_config>bin\app.exe
'bin\app.exe' is not recognized as an internal or external command,
operable program or batch file.
Ну, это интересно, мы получаем это для сборки... что-то (я понятия не имею, что, но это не моя программа).
Больше комбинаций! Давайте вернемся!
// dub.sdl
name "dub_dependency_config"
description "Example of configuring dependencies in dub.sdl."
authors "chadjoan"
copyright "Copyright © 2017, cjoan"
license "BSL-1.0"
dependency "sdlang-d" version="~>0.10.1"
configuration "application" {
targetType "executable"
targetName "bin/app"
mainSourceFile "source/app.d"
subConfiguration "sdlang-d" "sdlang-hax"
configuration "sdlang-hax" {
buildOptions "debugMode"
}
}
Выход:
C:\dprojects\dub_dependency_config>dub build --build=release-debug
Could not resolve configuration for package dub_dependency_config
Кляп ушел! Но я думаю, что это просто означает, что я потерпел неудачу сильнее.
В интересах изучения я попробую что-то, что, как я знаю, не сработает, так как я надеюсь получить какой-нибудь писк информации из тега subConfiguration:
// dub.sdl
name "dub_dependency_config"
description "Example of configuring dependencies in dub.sdl."
authors "chadjoan"
copyright "Copyright © 2017, cjoan"
license "BSL-1.0"
dependency "sdlang-d" version="~>0.10.1"
configuration "application" {
targetType "executable"
targetName "bin/app"
mainSourceFile "source/app.d"
}
subConfiguration "sdlang-d" "application"
Нет, моя неправильная попытка имела неправильный результат:
C:\dprojects\dub_dependency_config>dub build --build=release-debug
Could not resolve configuration for package dub_dependency_config
Как мне заставить это работать?
(В качестве отступления: я очень благодарен за формат.sdl. Я столкнулся с той же проблемой в версии.json, и только отсутствие возможности комментирования сделало это трудным для устранения неполадок, не говоря уже о документе.)
1 ответ
Я думаю, что вам нужно сослаться на конфигурации, доступные в самой зависимости. Dub doco не ясен, и я сделал подобную ошибку прежде. Для sdlang-d кажется, что в этих пакетах есть четыре конфигурации dub.sdl
- кли
- библиотека
- UnitTest встроенная_команда_оболочки
- модульный тест
Это варианты на выбор в subConfiguration
блок. Я не думаю, что вы можете объявить их в ваших пакетах dub.sdl, как вы делаете. В вашем первом блоке вывода это показывает, что sdlang-d создает library
конфигурации.