12

对于一个 github 托管的开源 C# 项目,也可以通过 NuGet 获得,应该如何组织源代码?具体来说:

  • .nu​​spec 文件应该在 github 存储库中吗?
  • .nu​​spec 文件是否应该与 .csproj 文件位于同一文件夹中?
  • NuGet 包树(/lib、/content 的东西)怎么样,既然生成了,它应该在 git 中吗?

我的想法是 NuGet 部分与 github 托管是分开的,因为项目源代码可用但 .nuspec 不可用,因为 NuGet 中的发布本身不是开源操作。没有人希望每个 fork 都构建和发布一个的NuGet 包,因此开源 Foo 包最终在图库中显示为“Rick's Foo”与“John's Foo”与“Alice's Foo”等。

但另一方面,我确实希望 github 源代码库充当项目的一站式存储库,如果我打开我的另一台笔记本电脑并从那里登记,我应该能够构建/打包/推送而无需重新创建从头开始整个 NuGet 基础架构(即只输入我的 API 密钥,仅此而已)。

这两个要求是相互矛盾的,我错过了什么明显的东西吗?

4

2 回答 2

9

我会做以下事情:

  • 提交.nuspec文件旁边的.csproj文件
  • 添加一个将包文件夹向上移动的nuget.config文件。
  • 在解决方案中启用包还原并且提交 NuGet 包存储库的内容
  • 创建一个 msbuild 文件(或您喜欢的任何构建工具),其中包含:
    • 构建源代码并创建 nuget 包的“构建”目标
    • 一个“发布”目标,它将 NuGet 包推送到 nuget.org 并将您的 API 密钥作为参数。

我个人在文件中维护nuget包的版本号,.nuspec并在我“发布”时手动更新它。通过这种方式,我可以标记我推送到 NuGet 提要的确切版本。

通过此设置,Visual Studio 中的构建不会生成 NuGet 包,但存储库中提供了所有工具来执行此操作。

文件夹结构如下所示:

   .\Docs\ ==> not in source repo
   .\Packages\ ==> not under source control
   .\Src\ ==> git repo here
   .\Src\MySolution.sln
   .\Src\.gitignore
   .\Src\MuRules.ruleset
   .\Src\build.proj ==> msbuild file to build everything.
   .\Src\MyProject\MyProject.csproj
   .\Src\MyProject\MyProject.nuspec
   .\Src\MyProject\nuget.config
   .\Build\ ==> not under source control
   .\Build\Debug\
   .\Build\Release\
   .\Build\Publish\

请注意包还原功能中的此错误,它将忽略您配置的包位置。http://nuget.codeplex.com/workitem/1990 ==> 这在 Nuget 2.7 中已修复

于 2012-11-07T15:37:56.973 回答
0

在nuget v2.8上,我只需要修改.gitignore并添加:

packages/

这将从提交中排除 nugetpackages文件夹。当您构建新的签出源代码时,将下载并恢复这些包。确保已启用包还原设置,但我认为它已在 v2.8 上默认启用。

于 2015-10-02T14:42:37.170 回答