使用git子模块恢复Nuget包

Sas*_*ann 17 git package nuget

我有一个项目,其中包括来自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\ "
Run Code Online (Sandbox Code Playgroud)

为什么nuget不能在子模块的解决方案目录中恢复?

谢谢

Sro*_*oun 19

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>
Run Code Online (Sandbox Code Playgroud)

至 :

 <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>
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!

  • 如果您必须修改子模块中的每个项目,您实际上是在修改子模块,这是一个很大的问题。正如@ Nuzzolilo 在下面所说的那样,该库必须对正在使用它的项目一无所知。他们应该是不可知论者。对不起,但这不是一个有效的答案。 (2认同)

Sat*_*ies 5

您可以使用符号链接: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%
Run Code Online (Sandbox Code Playgroud)

完整说明和源码:SolutionWithGitSubmodulesAndNuget