簡體   English   中英

使用git子模塊恢復Nuget包

[英]Nuget Package restore with git submodule

我有一個項目,其中包括來自git的2個子模塊。 兩個項目都啟用了“nuget包恢復”,父項目也是如此。 兩個包含的子模塊中的包文件夾未簽入,在簽出的項目中不存在。 構建父項目時,Nuget嘗試將子文件夾中的包還原到錯誤的包文件夾中!

"C:\Dev\git\oasisdb\odb_oasis_repository\ODB_OASIS_Repository\.nuget\NuGet.exe" install "C:\Dev\git\oasisdb\odb_oasis_repository\odb_oasis_rvm\ODB_OASIS_RVM_EF\ODB_OASIS_RVM_EF\packages.config" -source ""  -NonInteractive -RequireConsent -solutionDir "C:\Dev\git\oasisdb\odb_oasis_repository\ODB_OASIS_Repository\ "

為什么nuget不能在子模塊的解決方案目錄中恢復?

謝謝

Nuget正在打開的解決方案目錄中恢復軟件包。

您可以編輯子模塊項目的.csproj並修改包的dll引用:

   <ItemGroup>
    <Reference Include="Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.Rest.ClientRuntime.2.1.0\lib\net45\Microsoft.Rest.ClientRuntime.dll</HintPath>
      <Private>True</Private>
    </Reference>

至 :

 <ItemGroup>
<Reference Include="Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <HintPath>$(SolutionDir)\packages\Microsoft.Rest.ClientRuntime.2.1.0\lib\net45\Microsoft.Rest.ClientRuntime.dll</HintPath>
  <Private>True</Private>
</Reference>

希望這有幫助!

您可以使用符號鏈接:在nuget將所有包下載到解決方案的packages目錄后,在子模塊的根目錄中創建符號鏈接(命名packages並鏈接到解決方案級別packages目錄)。 簡而言之 - 在您的啟動項目中添加Pre-Build事件,該事件在您的解決方案packages目錄與所有子模塊packages目錄之間創建符號鏈接:

這是批次:

SET sourceDir=$(SolutionDir)packages
SET destDir=$(SolutionDir)..\..\submodules\saturn72\src\packages

if not exist %sourceDir% mkdir %sourceDir%

if not exist %destDir% mklink /j %destDir% %sourceDir%

完整的解釋和源代碼: SolutionWithGitSubmodulesAndNuget

如果您使用的是VS2015 Update 1或更高版本,則可以將項目轉換為使用project.json來解決此問題

簡而言之:

  • 為所有包運行Uninstall-Package <package name> -Force -RemoveDependencies 在執行此操作之前,您可能希望將packages.config復制粘貼到記事本中。
  • 從項目中刪除packages.config ,保存項目,卸載
  • 編輯項目文件並刪除:
    • 頂部的任何引用的.props文件都與nuget相關
    • 引用包的任何<Reference>元素
    • 底部引用nuget的.targets文件 - 通常以: <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    • 如果您的軟件包包含Roslyn分析器,請確保將其刪除。
  • 保存文件並重新安裝項目

添加project.json

{
  "dependencies": {
  },
  "frameworks": {
    ".NETFramework,Version=v4.6.1": {}
  },
  "runtimes": {
    "win": {}
  }
}

最后,在dependencies下手動或使用Install-Package或VS中的nuget UI再次添加包。

我還必須從我的項目中刪除任何Microsoft.Bcl.*包,因為它們顯式查找packages.config文件。

編輯:這(刪除Microsoft.Bcl.*包將給你一個編譯時錯誤,即使項目將構建正常,因為Microsoft.Bcl.Build添加的.targets文件仍將查找packages.config

要禁止此操作,請編輯項目文件並添加:

<SkipValidatePackageReferences>true</SkipValidatePackageReferences>

這需要轉到沒有設置Condition屬性的第一個<PropertyGroup> 如果沒有,只需在頂部添加另一個,如:

<PropertyGroup>
    <SkipValidatePackageReferences>true</SkipValidatePackageReferences>
</PropertyGroup>

暫無
暫無

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

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