2017-08-15 17 views
0

如果我有一个基于DUB的项目有一个可选的依赖关系,我如何使它成为一些代码(无论是模块还是版本(...){...}块)只有在依赖项被编译时才会被编译选择?有没有一种方法可以根据依赖关系是否存在来定义版本标识符?在DUB中,我如何根据可选的依赖项有条件地编译代码?

我已经阅读了关于“依赖”标签的“可选”和“默认”属性的文档here。这使我可以将依赖项定义为可选项,但如果我无法对代码进行版本化以反映所选依赖项,则缺乏依赖性。

回答

2

也许就可以了,我不知道,但似乎你可以使用这样的事情:

version(Have_name_of_dependency) 

因此,如果您可选的依赖将sdlang-d可以使用

Have_sdlang_d 

同作为here

这基于的配音代码this部分

+0

我认为你钉了它。谢谢! 我能够通过将它从dub.selections.json中删除并使用您建议的版本(Have_ *)代码来构建不依赖的项目。不幸的是,依赖于该项目的其他项目仍然坚持在其依赖图中包括可选的依赖项(ex:sdlang-d),尽管第一个项目中的default = false,而每个dub.selections.json文件中缺少sdlang-d参与其中。但是,这似乎是一个不同的问题......也许是一个错误或另一个问题要问。 – chadjoan

+0

你应该使用optional = true – Kozzi11

+0

optional = true被设置为(已经);对不起,我认为这是隐含的。 – chadjoan

0

除了使用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; 
} 

未测试,但它可能有助于捏。

相关问题