如果我有一个基于DUB的项目有一个可选的依赖关系,我如何使它成为一些代码(无论是模块还是版本(...){...}块)只有在依赖项被编译时才会被编译选择?有没有一种方法可以根据依赖关系是否存在来定义版本标识符?在DUB中,我如何根据可选的依赖项有条件地编译代码?
我已经阅读了关于“依赖”标签的“可选”和“默认”属性的文档here。这使我可以将依赖项定义为可选项,但如果我无法对代码进行版本化以反映所选依赖项,则缺乏依赖性。
如果我有一个基于DUB的项目有一个可选的依赖关系,我如何使它成为一些代码(无论是模块还是版本(...){...}块)只有在依赖项被编译时才会被编译选择?有没有一种方法可以根据依赖关系是否存在来定义版本标识符?在DUB中,我如何根据可选的依赖项有条件地编译代码?
我已经阅读了关于“依赖”标签的“可选”和“默认”属性的文档here。这使我可以将依赖项定义为可选项,但如果我无法对代码进行版本化以反映所选依赖项,则缺乏依赖性。
除了使用version(foo)
块并要求用户在他们的dub.sdl中使用versions: "foo"
之外,还有另外一种选择。它很糟糕,但它会起作用。
如果你的代码是一个模板,你可以用在相关的东西:
template HasVibe()
{
enum HasVibe =
is(typeof(() { import vibe.d; }));
}
template Foo(T) if (HasVibe!())
{
// your code here
}
如果它不是模板,你可以把它变成一个模板:
template log() if (HasVibe!())
{
import vibe.core.log : logDebug;
alias log = logDebug;
}
未测试,但它可能有助于捏。
我认为你钉了它。谢谢! 我能够通过将它从dub.selections.json中删除并使用您建议的版本(Have_ *)代码来构建不依赖的项目。不幸的是,依赖于该项目的其他项目仍然坚持在其依赖图中包括可选的依赖项(ex:sdlang-d),尽管第一个项目中的default = false,而每个dub.selections.json文件中缺少sdlang-d参与其中。但是,这似乎是一个不同的问题......也许是一个错误或另一个问题要问。 – chadjoan
你应该使用optional = true – Kozzi11
optional = true被设置为(已经);对不起,我认为这是隐含的。 – chadjoan