使用 git 子模块恢复 Nuget 包

Posted

技术标签:

【中文标题】使用 git 子模块恢复 Nuget 包【英文标题】:Nuget Package restore with git submodule 【发布时间】:2013-09-07 16:40:06 【问题描述】:

我有一个项目,其中包含来自 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 not getting missing packages的可能重复 【参考方案1】:

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>

希望对您有所帮助!

【讨论】:

如果您必须修改子模块中的每个项目,您实际上是在修改子模块,这是一个很大的问题。正如@ Nuzzolilo 下面所说,图书馆一定对正在使用它的项目一无所知。他们应该是不可知论者。抱歉,这不是一个有效的答案。 是的,当然,只有在您拥有子模块并且知道如何使用此技巧时才应使用此方法。感谢您的澄清 我发现 $(SolutionDir) 包含尾部反斜杠,因此可以将其删除。 标签似乎可以处理双反斜杠,但 标签不能并且会导致构建错误,例如【参考方案2】:

找到答案: 对于任何感兴趣的人:

http://www.xavierdecoster.com/how-to-nuget-package-restore-when-sharing-projects-between-solutions

NuGet not getting missing packages

【讨论】:

请标记为“答案”,这样它就不会出现在未回答的堆中。谢谢。 绝对不是。库项目不需要知道引用它的宿主项目的详细信息。 -1. 最新版本的 NuGet 是否发生了这种变化?【参考方案3】:

你可以使用符号链接: 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

【讨论】:

必须在 Windows 上使用 NTFS 连接,因为我的子模块的 .gitignore 没有忽略符号链接。【参考方案4】:

如果您使用的是 VS2015 Update 1 或更高版本,您可以convert your project to use project.json to fix this。

简而言之:

为所有包运行Uninstall-Package &lt;package name&gt; -Force -RemoveDependencies。在执行此操作之前,您可能需要将 packages.config 复制粘贴到记事本中。 从项目中删除packages.config,保存项目,卸载 编辑项目文件并删除: 任何与 nuget 相关的顶部引用的 .props 文件 任何引用包的 &lt;Reference&gt; 元素 底部引用 nuget 的 .targets 文件 - 通常以:&lt;Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"&gt; 开头 如果您的包裹中包含 Roslyn 分析仪,请务必将它们也删除。 保存文件并重新加载项目

project.json 添加到:


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

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

我还必须从我的项目中删除任何 Microsoft.Bcl.* 包,因为它们会明确查找 packages.config 文件。

编辑:这个(删除Microsoft.Bcl.* 包会给你一个编译时错误,即使项目可以正常构建,因为.targets 文件Microsoft.Bcl.Build 添加仍然会寻找packages.config

要抑制这种情况,请编辑您的项目文件并添加:

<SkipValidatePackageReferences>true</SkipValidatePackageReferences>

这需要转到第一个没有Condition 属性集的&lt;PropertyGroup&gt;。如果没有,只需在顶部添加另一个,例如:

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

【讨论】:

以上是关于使用 git 子模块恢复 Nuget 包的主要内容,如果未能解决你的问题,请参考以下文章

Git在添加主存储库之前恢复主存储库后未删除子模块

使用git子模块管理项目

子模块内的 Git 子模块(嵌套子模块)

使用 Git 复制子模块

React 项目无法在 git 子模块中使用节点模块

git中submodule子模块的添加使用和删除