2017-08-15 18 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; 
} 

未測試,但它可能有助於捏。

相關問題