7

我在解決方案文件中有20個項目。其中1個項目是所有項目參考的標準庫項目。將綁定重定向添加到每個app.config

大約一年前,我們添加了一個新的nuget包,我們將其稱爲Package A版本5.0.0.0。它有一堆文件,它們在我們編譯時會轉移到全部,但我們最終會處理它。我們將該包添加到我們的標準庫項目(另一個參考文獻19)。

我是新來的Nuget(所以也許我做錯了什麼),所以我做了一個新的包,作爲Package A的幫手。我已經設置了一切,以便助手依賴於Package A版本3.0.0.0到5.0.0.0(所以它適用於其他版本低於我們的版本)。讓我們打電話給這個新套餐Package A helper

我安裝了Package A helper,一切正常。我去做一個拉請求,並在我們的解決方案的每一個的app.config現在有

<runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
       <dependentAssembly> 
         <assemblyIdentity name="Package.A" publicKeyToken="8FC3CCAD86" culture="neutral"/> 
         <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/> 
       </dependentAssembly> 
     </assemblyBinding> 
</runtime> 

它將編譯罰款沒有它,但視覺工作室抱怨並給出了一個警告。是什麼賦予了?我的經理現在不讓我合併我的代碼,因爲它在app.config中添加了太多的噪音,並且依賴於套餐A太多。

爲什麼添加一個依賴於Package A的nuget包,然後必須有這個新的bindingRedirect當我們安裝Package A Helper之前主要的依賴已經滿足了?

爲什麼它會說0.0.0.0-5.0.0.0當我在NuGet包和package.config指定3.0.0.0-5.0.0.0

更新:

當我建立Package A helper與引用到Package A版本5.0.0.0,那麼所有bindingRedirects都不會在每個app.config中自動填充,而是會生成警告。我最初使用3.0.0.0構建它,因爲我認爲最好是用最低的依賴關係來構建它。問題仍然存在,因爲visual studio仍然警告並且建議bindingRedirects被創建。

No way to resolve conflict between "Package A, Version=5.0.0.0, Culture=neutral, PublicKeyToken=83hfhsd33" and "Package A, Version=3.0.0.0, Culture=neutral, PublicKeyToken=83hfhsd33". Choosing "Package A, Version=5.0.0.0, Culture=neutral, PublicKeyToken=83hfhsd33" arbitrarily. 
Consider app.config remapping of assembly "Package A, Culture=neutral, PublicKeyToken=83hfhsd33" from Version "3.0.0.0" [] to Version "5.0.0.0" [path to Package A dll] to solve conflict and get rid of warning. 

是解決只是改變從3.0.0.0我的NuGet包依賴關係5.0.0.0,只是允許5.0.0.0和我擺脫我allowedVersions="[3,6)" packages.config?我不想減少nuget包的幫助和向後兼容性,但同時我不需要警告或綁定我的主要解決方案所需的引導。

更新2:所以設置Copy Local在參考屬性False實際上解決了我的問題,但我不明白爲什麼。

+0

請問您可以添加關於您所看到的警告的詳細信息嗎? –

+0

@SimonMᶜKenzie他們被添加了。 – LearningJrDev

回答

3

我原本有3.0.0.0建造它,因爲我想這是最好的......

這就是問題開始的地方。您的解決方案現在取決於兩個兩個不同版本的A.dll,一個將覆蓋另一個。 A.dll的哪個版本最終被複制到bin \ Debug中是隨機的。無論什麼項目最後建成。

這不能很好地結束,解決方案註定要失敗執行。如果將成爲A-helper.dll中的代碼,則當5.0.0.0版本最終被複制時它將失敗。或者它將成爲任何其他項目使用的代碼A.dll,它將在3.0.0.0版本被複制時失敗。最終結果是解決方案將始終失敗。

所以你看到構建系統正在做一些事情。它注意到這個差異,並選擇其中一個版本來贏。它選擇5.0.0.0,這是正確的選擇。它也修改app.config,添加bindingRedirect,因此要求加載3.0.0.0版本的代碼實際上會得到5.0.0.0。 可能工作,如果你使版本5與版本3兼容。或者不是,主要版本號中的兩個增量通常會帶來麻煩。你會發現什麼時候你測試。

所以設置複製本地的參考屬性設置爲False實際上解決了我的問題

相信沒有解決不了的問題,你只是從假設它應該解決這個問題爲您防止構建系統。由於不再需要複製DLL,因此它會推測您將在GAC中安裝程序集,以便兩個版本可以共存。也許你做過了,這在開發機器上這樣做並不常見,而且一般來說非常不明智。鑑於額外的安裝步驟,您的老闆和團隊成員不太可能會喜歡這種解決方案。


因此有兩個基本的東西,你可以這樣做:

  • 讓構建系統排序了這一點。正如它那樣,它正確地解決了問題,並且您的解決方案將工作。如果版本5與版本3兼容,那麼A-helper.dll中的代碼甚至可以正確執行。如果老闆不喜歡它,那麼你當然必須從頭開始做這件事:

  • 將A-helper項目中的引用更改爲A版本5.0.0.0。現在不再有任何不兼容性,唯一的A.dll對所有代碼都有好處。根據您的要求,這是您的老闆會喜歡的唯一解決方案。

+0

我最終用A helper中的版本5進行編譯,然後添加一個安裝powerscript,將複製本地設置爲false。這沒有任何警告(也是版本3和5是不好的例子,真正的版本是在一個主要版本)。 我很好奇,雖然現在已經編譯了版本5,我試圖用版本3創建一個新項目,儘管我說它只需要3+,但它不會工作。這就是爲什麼我編譯版本3,使版本3的人可以使用插件。 – LearningJrDev