【问题标题】:In DUB, how do I conditionally compile code based on optional dependencies?在 DUB 中,如何根据可选依赖项有条件地编译代码?
【发布时间】:2017-08-15 16:42:55
【问题描述】:

如果我有一个带有可选依赖项的基于 DUB 的项目,如何制作它以便某些代码(无论是模块还是版本(...){...} 块)仅在依赖项时才被编译被选中?有没有办法可以根据依赖项是否存在来定义版本标识符?

我已经阅读了here 中记录的“依赖”标签的“可选”和“默认”属性。这允许我将依赖项定义为可选的,但如果我无法对代码进行版本化以反映所选的依赖项,它就会缺乏牙齿。

【问题讨论】:

    标签: d dub


    【解决方案1】:

    也许你可以,我不确定,但似乎你可以使用这样的东西:

    version(Have_name_of_dependency)
    

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

    Have_sdlang_d
    

    here

    这是基于this部分配音代码

    【讨论】:

    • 我认为你成功了。谢谢!通过从 dub.selections.json 中删除它并使用您建议的 version(Have_*) 代码,我能够构建没有依赖关系的项目。不幸的是,其他依赖该项目的项目仍然坚持在其依赖关系图中包含可选依赖项(例如:sdlang-d),尽管第一个项目中的 default=false 并且每个 dub.selections.json 文件中都没有 sdlang-d涉及。但这似乎是一个不同的问题......可能是一个错误或另一个要问的问题。
    • 你应该使用 optional=true
    • optional=true 也(已经)设置好了;抱歉,我认为它是隐含的。
    【解决方案2】:

    除了在 dub.sdl 中使用version(foo) 块并要求人们使用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;
    }
    

    未经测试,但在紧要关头可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2020-02-06
      • 2013-06-08
      • 1970-01-01
      • 2019-06-01
      相关资源
      最近更新 更多