NuGet和Git子模块

27

我已经广泛搜索了解决方案,并尝试了不同的方法,但都没有成功,所以我在这里提问。

我当前的需求是拥有单独的 Git 存储库,每个存储库包含一个 .Net 解决方案文件和相关项目。其中一个或多个存储库仅包含类库,我需要在其他存储库解决方案中使用这些库。

我的第一想法是使用 Git 子模块来避免丑陋的复制粘贴,并在开发应用程序时仍然可以访问类库的源代码。

因此,我的尝试是包含子模块,然后在我的当前解决方案中进行 "添加现有项目" 并加载所需的类库(们)。

我一直无法解决的巨大问题是 Nuget 包还原。导入的项目引用了 "..\Packages*" 中的库,但当作为子模块导入时,它们位于另一个子文件夹中,因此无法找到所需的依赖项:

- MySolution.sln
- Packages folder
- MyAppProject folder
- Submodule folder
-- EXPECTED packages folder for MyLibraryProject that I cannot generate
-- MyLibraryProject folder

我找到并尝试了一个解决方案这个,但它有两个主要问题:

  • 它应该使用MsBuild包恢复工具来工作,但我绝对不想使用它
  • 即使尝试使用MsBuild包还原工具,它也完全没有起作用,我当前的解决方案文件夹中仍然只有一个"Packages"文件夹。也许我做错了什么,但是我仍然不想使用MsBuild方法。

现在我真的很想知道是否有一种简洁的方法来解决这个问题,或者我唯一能做的就是放弃在我的应用程序解决方案中拥有库源代码,并在私有NuGet提要中发布我的库并从那里引用它们。

谢谢。


1
你是否考虑过在 MyLibraryProject 中使用 NuGet 而不是 git 子模块?运行本地 NuGet 服务器,为库生成一个 NuGet 包,并在应用程序中添加对其的引用。这只是一个选项... - Jon Skeet
谢谢您的建议。我确实考虑过这个选项,但我们正在考虑使用像AppHarbor这样的在线CI服务,这将迫使我们使用公共(付费)nuget服务,例如MyGet,以便能够从CI服务器还原包,并且我们想避免这种情况。 - Matteo Mosca
好的。你必须为库项目拥有两个目录级别吗?(子模块目录是否可以只是库项目目录本身?) - Jon Skeet
我不确定我是否正确理解了你的意思。Git强制子模块至少有一个子目录级别,因此您不能将子模块放在当前存储库根目录中。这足以使子模块的包位置出错。 - Matteo Mosca
也许可以看一下 http://fsprojects.github.io/Paket/github-dependencies.html ? - Kamil Bałdyga
2个回答

8

我看到有一个干净的PowerShell脚本可以修复提示路径,所以我可以编写脚本。我会评估这个可能的解决方案,谢谢。 - Matteo Mosca
虽然这是可行的,但我们仍在决策过程中,尽管看起来我们将使用Nuget作为内部依赖项,而不是git子模块,正如@jon-skeet建议的那样。 - Matteo Mosca
不幸的是,当你更新一个包时,NuGet会覆盖HintPath,因此你必须再次运行脚本。也许在这里使用git pre commit hook会更方便。 - Johannes Egger

4
您可以通过将所有*.csproj文件中的..\packages更改为$(SolutionDir)\packages来解决此问题。这个脚本很好用: find -name "*.csproj" | xargs sed -i 's/\.\.\\packages/$(SolutionDir)\\packages/g'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接