2016-01-01 49 views
4

我正在用asp.net 5.0中的'項目'與'包'(即Nuget包)引用混雜在一起。我真的希望有人能夠更全面地解釋引用在asp.net 5.0中引入的方式。 'dnu restore'如何確定是否某項是項目引用而不是包引用?'DNU RESTORE'如何確定依賴項是項目引用而不是包引用?

我原以爲一個參照將作爲一個項目,如果項目是在同一目錄拉,但是這顯然不是故事的全部。它看起來似乎可以有更深層次的目錄嵌套,並仍然可以獲取項目引用。

這裏是我常用的項目結構的輪廓:

我有一組項目,其中一些互相引用。有一些名爲TextHelpers和MathHelpers的庫和一個名爲MainProject的項目。這些庫位於名爲Libraries的文件夾中,MainProject位於名爲Tools的文件夾中。這種分離是必要的,因爲庫和工具屬於不同的Git回購:

  • 根/庫/ TextHelpers.Project1 - 版本1.0.0- *
  • 根/庫/ TextHelpers.Project2 - 版本1.0.0- *
  • 根/庫/ MathHelpers.Project1 - 版本1.0.0- *
  • 根/庫/ MathHelpers.Project2 - 版本1.0.0- *
  • 根/工具/ MainProject - 版本1.0.0- *

通常,MainProject將庫作爲Nuget軟件包的引用從私有的Nuget存儲庫(僅在文件系統上的文件夾)提供庫。

雖然我建MainProject,但是,有時我需要做出改變圖書館的一個項目,有時我想踏入文件,無需使用的NuGet符號服務器。出於這個原因,我想切換到(實時)項目而不是從(靜態)Nuget包中引用。我將如何做到這一點?

多少到目前爲止,我已經發現了這一點:如果我有一個global.json文件,「DNU還原」創建一個帶有「項目」,而不是「一攬子」參考一project.lock.json。這是整個故事嗎?

+0

您可以包含您在解決方案中使用的'global.json'或可選的'nuget.config'嗎?在你的解決方案中沒有'nuget.config',那麼你可以包含'%APPDATA%\ NuGet \ NuGet.Config'的內容。什麼顯示'dnu feeds list'?你是否在命令行中顯式地使用了'dnu restore'而沒有任何參數(比如'--no-cache',這很有趣,請參閱'dnu restore --help'),或者你僅僅使用Visual Studio 2015? – Oleg

回答

2

dnudnx看在以下文件夾:

  1. 其中當前項目是文件夾(這意味着包含當前項目的project.json的文件夾的父文件夾中)。例如。如果你有repo/src/project1/project.json它將在repo/src
  2. 任何其他文件夾包含在global.json

則算法是真的很幼稚:如果發現一個文件夾的包以上任一中它會提到的文件夾匹配名稱假設這些是該包的來源。

舉例來說,如果你有

src/P1/project.json 
src/System.Collections/project.json 

src/P1/project.json你必須System.Collections參考,它將使用src/System.Collection而不是NuGet包System.Collections的。項目優先於軟件包。

注意事項:

  1. 由於algoritm看起來在global.json當前文件夾和一切你也許能夠從一個文件夾而不是另一個引用一些項目。如果在我之前的示例中,您將添加test/T1/project.json項目,但src不在global.json那麼src中的項目將引用System.Collections該項目,而T1將引用該包(安裝在全局包文件夾中)。
  2. 有沒有驗證,看看項目引用是否實際上是該包。如果名稱匹配,則匹配。所以一個空的項目可以取代任何包裹。
  3. 如果您有多個具有相同名稱的項目,可能會遇到麻煩。

希望這會有所幫助並回答你的問題。

備註:使用dotnet(替換dnx的工具),您可以爲每個參考指定是否希望項目或包具有更高的優先級。

+0

優秀答案Victor。謝謝。因此,在我的設置中打開/關閉包含外部項目與包的祕密是global.json文件中的「projects」屬性?我假定系統在正在恢復的project.json文件上面的文件夾層次結構中查找第一個'global.json'文件。 –

+0

確切地說,它使用父文件夾中最近的'global.json'。 –

+0

偉大的東西維克多! –

相關問題