簡體   English   中英

通過MSBuild目標解決.NET 4.7外部項目NuGet依賴項

[英]Resolve .NET 4.7 external project NuGet dependencies via MSBuild targets

我們需要構建這些項目,並且它們有一些奇怪的實踐。 它們依賴於另一個項目的構建過程所生成的鏈接代碼文件。 這些項目位於子文件夾中。

因此,在構建項目之前,我們需要構建子項目。 這是通過將自定義構建目標添加到每個項目的BeforeBuild目標來完成的,並且似乎可行。 但是,如果不還原NuGet依賴項,則不會構建子項目。

需要說明的是:我們知道這種模式完全是傻瓜,但我們沒有像重構使用該模式的每個項目那樣的人力。 我們只是試圖讓它們一步一步可靠地進行編譯。

這些外部項目依賴項中的每一個都在自定義ItemGroup中列出,如下所示:

<ItemGroup> <ExternalDependantProjects Include= "..\\<subfolder>\\<project>\\<project>.csproj" /> </ItemGroup>

我們一直在嘗試通過添加每個項目的BeforeBuild目標調用的自定義構建目標來解決此問題。 我們首先嘗試使用ResolveNuGetPackageAssets作為構建目標,但是發現我們僅將net47作為目標,這僅在netcore中受支持。

現在,我們試圖編寫一個自定義構建目標,該目標將還原外部項目中的NuGet依賴項。 我們已經嘗試了簡單的方法,如下所示: <Exec Command="nuget restore @(ExternalDependantProjects)" />以及更復雜且棘手的PowerShell嘗試: <Exec Command="powershell.exe -command &quot;&apos;@(ExternalDependantProjects, '&apos; &apos;')&apos; | foreach { nuget restore $_ }&quot;" /> <Exec Command="powershell.exe -command &quot;&apos;@(ExternalDependantProjects, '&apos; &apos;')&apos; | foreach { nuget restore $_ }&quot;" />

在這兩種情況下,它都只是嘗試還原主項目的軟件包,而不是外部項目的軟件包。 似乎@(ExternalDependantProjects)等於空白,因此沒有添加新參數。 使用表明@(ExternalDependantProjects)不返回任何內容。 但是,當我們調用MSBuild“ Build”目標時,它確實作為“ Projects”參數起作用。 因此,我懷疑我們是否以錯誤的方式使用了Item參數? 也許有一些語法可以訪問Item的Include屬性?

但是,我不確定如果我們能夠解決該問題,它是否也將起作用。 我們在子項目上使用nuget restore命令進行了測試,並始終獲得安裝package.conf中所有軟件包的響應。 但是,該外部項目中的.. \\ packages \\為空,packages.conf指定了六個軟件包(VS中的“ References”中也缺少它們,並且引用的HintPath正確地指向了.. \\ packages)。

因此,我們在三個方面感到困惑:如何引用來自MSBuild目標的ExternalDependentProjects項包含路徑,為什么NuGet還原CLI不能正常工作,這甚至是解決此問題的正確方法嗎? 我們是否完全走錯了道路?

NuGet發現packages.config項目以從解決方案文件中還原。 如果所有項目都在解決方案文件中,並且您運行nuget.exe restore <solution file> ,則無論項目文件中發生了什么,都應將其還原。

作為任何自定義方案的解決方法,您可以編寫腳本以發現文件夾中的所有packages.config文件,然后直接對文件調用nuget.exe restore <packages.config> -SolutionDirectory <solution root> 對於packages.config還原,唯一需要的部分是從packages.config文件中查找id /版本列表,以便可以將它們下載並解壓縮到解決方案級別的packages文件夾中。

我還建議使用帶有ReferenceOutputAssembly=false Project引用,以確保項目按您想要的順序構建,並且不會互相引用。 請參閱: https : //blogs.msdn.microsoft.com/kirillosenkov/2015/04/04/how-to-have-a-project-reference-without-referencing-the-actual-binary/

我們如何引用來自MSBuild目標的ExternalDependentProjects項包含路徑,為什么NuGet還原CLI無法正常工作,這甚至是解決此問題的正確方法嗎? 我們是否完全走錯了道路?

您應該使用-OutputDirectory選項編寫自定義構建目標,因此自定義構建目標應如下所示:

  <Target Name="BeforeBuild">
      <Exec Command="nuget restore @(ExternalDependantProjects) -OutputDirectory ..\<subfolder>\packages" />
  </Target>

通過此目標,將成功還原用於外部項目的NuGet軟件包。

此外, @(ExternalDependantProjects)值不等於空白,可以使用目標回顯該值。

以下是我的測試樣本,您可以參考一些詳細信息:

ExternalpProject是子文件夾名稱, TestExternalProject是外部項目名稱。

<ItemGroup>
  <ExternalDependantProjects Include= "..\ExternalpProject\TestExternalProject\TestExternalProject.csproj" />
</ItemGroup> 

<Target Name="BeforeBuild">
  <Message Text="Restore package for Externalp Project" Importance="high"></Message>
  <Exec Command="nuget restore @(ExternalDependantProjects) -OutputDirectory ..\ExternalpProject\packages" />
</Target>

<Target Name="AfterBuild">
  <Message Text="Display the value of ExternalDependantProjects" Importance="high"></Message>
  <Message Text="@(ExternalDependantProjects)"></Message>
</Target>

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM