在我的项目开发过程中,由于项目引用了本地局域网中的 nuget 服务器,而这个 nuget 服务器是基于.net framework 搭建的。当我在 Linux 服务器上通过 git clone 将代码拉取下来,并尝试发布到 docker 容器中时,使用 docker build -t xxxxx. 这一命令却出现了问题。具体表现为提示 “找不到包,No packages exist with this id in source (s): nuget.org”。
经过分析,我意识到这是因为在这种环境下无法找到原有的 nuget 服务器。所以,需要在有外网环境或者在 Linux 服务器自身的环境中发布一个新的 nuget 服务器。在这个过程中,我想到了可以使用 gitea 来实现这个目标。
首先,在本地电脑上添加一个 nuget 源指向 gitea 服务器。具体操作如下:
dotnet nuget add source --name gitea --username xxxxx --password xxxxx https://git.kecq.com/api/packages/xxxxx/nuget/index.json
其中,“xxxx” 为 gitea 的用户名和密码。然而,在 Linux 环境中运行这个命令时,会出现错误提示:“error: Password encryption is not supported on.NET Core for this platform. The following feed try to use an encrypted password: 'gitea'. You can use a clear text password as a workaround.” 以及 “error: Encryption is not supported on non-Windows platforms.”。为了解决这个问题,需要在上述命令中添加 “--store-password-in-clear-text” 参数。例如:
dotnet nuget add source --name gitea --username xxxx --password 123456 --store-password-in-clear-text https://git.kecq.com/api/packages/xxxxx/nuget/index.json
如果想要移除上面添加的 nuget 源,可以使用以下命令:
dotnet nuget remove source gitea
接着,在 Visual Studio 中,可以通过在项目上点击右键,选择 “打包 (P)” 菜单来生成包。然后,将生成的包发布到 gitea 服务器上,命令如下:
dotnet nuget push --source gitea xxxxx.2.0.4.nupkg
后面可以使用绝对路径来指定包的位置。
不过,我觉得这样的操作方式还是比较麻烦,因此我希望能够将其集成在 Visual Studio 中。为此,我先新建了一个 bat 文件,其内容如下:
rmdir /s /q D:\nuget\packer\temp
dotnet pack %1 -o D:\nuget\packer\temp
dotnet nuget push --source gitea D:\nuget\packer\temp\%~2.*.nupkg
然后,在 Visual Studio 中点击 “工具 -> 外部工具”,添加一个类似于以下截图的工具。第三行参数为 “【Arguments】(ProjectFileName)
。
需
要
注
意
的
是
,
在
第
三
个
” 前有一个空格,建议原封不动地粘贴过去。但是,在我的 Visual Studio 控制台中会出现乱码问题,目前还不知道该如何解决。
另外,我发现在 Linux 中添加了 nuget 源之后,使用docker build -t myblog.命令仍然会报出 “error NU1101: Unable to find package FYJ.Common. No packages exist with this id in source (s): nuget.org [/src/Blogs.UI.Main/Blogs.UI.Main.csproj]” 的错误。即使我在 “/root/.nuget/packages” 中放置了包,仍然会报找不到此包的错误。经过进一步排查,发现是运行dotnet restore时出现了错误。
按照官方文档,我在解决方案根目录下增加了nuget.config文件,因为我的Dockerfile是放在解决方案的.sln文件所在目录。参考官方文档中nuget.config文件的内容,我的配置如下:
<add key="globalPackagesFolder" value="~/.nuget/packages" />
但是,手动运行dotnet restore "./Blogs.UI.Main/Blogs.UI.Main.csproj"时,发现与docker build -t myblog.报出的信息不一致。这里的nuget.config文件中的 XML 根节点感觉不应该是官方文档中的