使用 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) 包含尾部反斜杠,因此可以将其删除。找到答案: 对于任何感兴趣的人:
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 <package name> -Force -RemoveDependencies
。在执行此操作之前,您可能需要将 packages.config
复制粘贴到记事本中。
从项目中删除packages.config
,保存项目,卸载
编辑项目文件并删除:
任何与 nuget 相关的顶部引用的 .props
文件
任何引用包的 <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.*
包会给你一个编译时错误,即使项目可以正常构建,因为.targets
文件Microsoft.Bcl.Build
添加仍然会寻找packages.config
。
要抑制这种情况,请编辑您的项目文件并添加:
<SkipValidatePackageReferences>true</SkipValidatePackageReferences>
这需要转到第一个没有Condition
属性集的<PropertyGroup>
。如果没有,只需在顶部添加另一个,例如:
<PropertyGroup>
<SkipValidatePackageReferences>true</SkipValidatePackageReferences>
</PropertyGroup>
【讨论】:
以上是关于使用 git 子模块恢复 Nuget 包的主要内容,如果未能解决你的问题,请参考以下文章