簡體   English   中英

MsBuild 在 Visual Studio Online 上找不到已恢復的 NuGet 包

[英]MsBuild does not find restored NuGet-Packages on Visual Studio Online

我嘗試在 Visual Studio Online 上構建存儲在外部 GIT 存儲庫中的解決方案。

它有以下步驟:

1:Git 恢復 - 有效

2:NuGet 恢復 - 有效

3:構建 - 不起作用

查看日志時,我的第一個猜測是 MsBuild 沒有在尋找 NuGet 存儲它們的包。 NuGet Restore 中的一些行:

2018-03-14T21:10:11.0352862Z Completed installation of AngleSharp 0.9.9
2018-03-14T21:10:11.0353230Z Adding package 'AngleSharp.0.9.9' to folder 'D:\a\1\s\packages'
2018-03-14T21:10:11.0353563Z Added package 'AngleSharp.0.9.9' to folder 'D:\a\1\s\packages'
2018-03-14T21:10:11.0354972Z Added package 'AngleSharp.0.9.9' to folder 'D:\a\1\s\packages' from source 'https://api.nuget.org/v3/index.json' 'Microsoft.SharePointOnline.CSOM.16.1.7317.1200' to folder 'D:\a\1\s\packages' 

MsBuild 中的一些行:

018-03-14T21:10:21.2105399Z PrepareForBuild:
2018-03-14T21:10:21.2105793Z   Creating directory "bin\Release\".
2018-03-14T21:10:21.2424947Z   Creating directory "obj\Release\".
2018-03-14T21:10:30.3569560Z ResolveAssemblyReferences:
2018-03-14T21:10:30.3570425Z   Primary reference "AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL".
2018-03-14T21:10:30.3670272Z ##[warning]C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2041,5): Warning MSB3245: Could not resolve this reference. Could not locate the assembly "AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.

我的解決方案/包結構是:

....\mysolution\myproject\myproject.csproj
....\mysolution\myproject\packages.config

當前配置: NUGET 在此處輸入圖像描述 那么我如何更改 Nuget 和/或 msbuild-behavior 來完成這項工作呢?

(更新) :要解決這個問題:我的每個包都有這個問題。 它們都在 packages.config 中,每個都是從 Nuget 下載的,但每個也不是從 MsBuild 中找到的

(Update2)當前生成的命令如下: NUGET:

D:\a\_tool\NuGet\4.4.1\x64\nuget.exe restore D:\a\1\s\AweCsomeO365\packages.config -PackagesDirectory D:\a\1\a\packages -Verbosity Detailed -NonInteractive -ConfigFile D:\a\1\Nuget\tempNuGet_22.config

建立:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe" "D:\a\1\s\AweCsomeO365\AweCsomeO365.csproj" /nologo /nr:false /dl:CentralLogger,"D:\a\_tasks\VSBuild_(GUID)\1.126.0\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll";"RootDetailId=(GUID)|SolutionDir=D:\a\1\s\AweCsomeO365"*ForwardingLogger,"D:\a\_tasks\VSBuild_(GUID)\1.126.0\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll" /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=D:\a\1\a /p:ReferencePath=D:\a\1\a\packages /p:platform="anyCPU" /p:configuration="Release" /p:VisualStudioVersion="15.0" /p:_MSDeployUserAgent="VSTS_(GUID)_build_4_22

我替換了 GUID; tempNuGetConfig 似乎是由 VSTS 動態生成的

仍然。 即使日志指出 nuget 存儲包

Added package 'AngleSharp.0.9.9' to folder 'D:\a\1\a\packages'

MsBuild 似乎沒有在那里找到它們:

 For SearchPath "D:\a\1\a\packages".
2018-03-16T13:57:42.4625155Z           Considered "D:\a\1\a\packages\AngleSharp.winmd", but it didn't exist.
2018-03-16T13:57:42.4625456Z           Considered "D:\a\1\a\packages\AngleSharp.dll", but it didn't exist.
2018-03-16T13:57:42.4625730Z           Considered "D:\a\1\a\packages\AngleSharp.exe", but it didn't exist.

VSTS 配置值:

MsBuild:/p:ReferencePath=$( /p:ReferencePath=$(Build.StagingDirectory)\packages

Nuget-DestiantionDirectory: $(Build.StagingDirectory)\packages

(update3):我沒有解決方案文件,但該存儲庫中只有一個 csproj 文件

問題是在項目內部有一個包的提示路徑指向一個不在 GIT-Repository 中的位置(並且不應該):

  <Reference Include="AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL">
      <HintPath>..\..\AweCsome365Test\packages\AngleSharp.0.9.9\lib\net45\AngleSharp.dll</HintPath>
    </Reference>

我最初的方法是為 NuGet 定義一個目標目錄,為 MSBuild 定義一個源目錄,以便將另一個位置用於兩個都能理解的包。

但問題(據我所知)是,NuGet 總是創建一個子文件夾結構"./packages/{PackagesName}/lib/net45/{file}" ,而 MSBuild 在設置"./packages"時看起來並不遞歸作為源路徑。

以上只是對遇到同樣問題的未來人的解釋

所以我的解決方案是模仿 nuget 的本地行為並更改輸出目錄以匹配存儲庫中的 HintPath(即使沒有“AweCsome365Test”)目錄: Nuget 目標目錄設置

(我會讓這個問題懸而未決,因為這個解決方案聞起來有魚腥味。如果有人有更好的解決方案,允許在不使用 HintPath 的情況下鏈接 nuget 和 msbuild,我很樂意將我的賞金花在它上面)

我相信您的 MSBuild“ReferencePath”參數不正確。 您告訴 MS Build 您的所有引用(包括 nuget 包及其 dll)都將位於“D:\a\1\a\packages”,但這不是 nuget 下載和存儲包和 dll 的位置。 Nuget 將下載文件並將其解壓縮到 D:\a\1\a\packages\{packageName}\{version}\lib\{environment}\package.dll。 我認為您需要從 MSBuild 參數中刪除最后一個參數 (ReferencePath)。

我還注意到您的 PackageLocation 參數與 NuGet 恢復任務的目標不同,您是否需要像恢復任務中的目標一樣向該參數添加“\packages”?

將 nuget 還原目標目錄更改為 $(Build.SourcesDirectory)\packages 並刪除 msbuild ReferencePath 參數。

這里的答案基本上是正確的。 但是,值得注意的是可能導致此行為的另一個原因。 我的工具鏈使用的是 Azure DevOps,它與 Visual Studio Online 基本相同,只是幾年之后。

原因:

  • 從不同的解決方案(交叉回購)引用您的項目,例如用於調試目的
  • 從您引用它的外部位置更新有問題的項目中的 NuGet 引用

這樣做是在安裝包時使用包的解決方案位置。

對於 .Net 核心/標准項目,使用 Update-Package -reinstall 似乎可以解決問題。 但是,對於 .Net Framework 項目,即使packages.json可能會重建, .csproj中的<HintPath />節點仍保持原樣 - 引用 Azure 永遠不會創建的包文件夾。

簡單修復:

  1. 右鍵單擊本地有問題的解決方案,然后選擇“卸載
  2. 右鍵單擊卸載的項目,選擇edit.csproj
  3. 找到任何看起來像../../OtherRepo/packages的提示路徑(使用的斜線可能會有所不同),並將它們更改為../packages
  4. 確認解決方案仍在本地構建
  5. 將更改推送到 Azure,祈禱吧

這種方法將解決由從錯誤位置合並/更新包引起的問題,而不是需要更改構建管道來欺騙該位置(在可能的情況下,它也不能很好地工作)。

暫無
暫無

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

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