前言
最近把很多项目都迁移到dotnet core2.0,手头上基本上已经没有经典的.NET framework了,说实话,好处还是多多的。平台不同了,虽然代码也编译通过,但是运行起来可能还是有点坑的,比如吧,获取到的时间格式不同了,或者服务启动方式改变了等等。于是需要切换到linux下开发和调试。
本来这样切换过来也没什么毛病,但是有个项目使用的是自己搭建的nuget源,配置了认证,然而nuget默认的配置中认证密码那些东西是加密编码处理的,在非Windows环境下,是不能直接使用加密认证的。突然想起公司的项目上CI的使用这个私有的nuget源是启动了个nginx转发代理拿到的。
解决方案
首先,为了添加私有源,先装个nuget,
我的操作环境为debian 9所以在终端执行:
sudo apt-get install nuget
然后看到一堆输出,由安装的依赖包可以看出这样安装的nuge是依赖mono的
安装后继续添加我们的使用源(参数改成你自己的):
nuget sources add -Name yourNuget -source https://nuget.yourSite.com/nuget -User admin -pass yourPassword
输出Package Source with Name: yourNuget added successfully.
这个配置的位置是:
~/.config/NuGet/NuGet.Config
注意:是在家目录下的config文件夹而不是nuget,这里是第一个坑
使用cat打开:cat ~/.config/NuGet/NuGet.Config
可以看到packageSourceCredentials
节点
然后在项目是执行dotnet restore看下是不是可以了
恭喜你,私源的包完成装不上
想了好久没想通,不是刚把源添加了么,WTF
后来在github溜达一圈有点发现:https://github.com/NuGet/Home/issues/6221
大概是说当执行dotnet restore命令的时候,实际上读取的配置居然是~/.nuget/NuGet/NuGet.Config
这个配置目前看起来是这样的
也就是说刚才我们使用nuget添加的源并没有添加有效咯
那我去把~/.config/NuGet/NuGet.Config
复制到~/.nuget/NuGet/NuGet.Config
理论就好了哦
cp ~/.config/NuGet/NuGet.Config ~/.nuget/NuGet/NuGet.Config
走一波然后restore试下发现如下
Retrying 'FindPackagesByIdAsyncCore' for source 'https://nuget.yoursite.com/nuget/FindPackagesById()?id='FM.Redis''.
Password decryption is not supported on .NET Core for this platform. The following feed uses an encrypted password: 'yourNuget'. You can use a clear text password as a workaround.
Encryption is not supported on non-Windows platforms.
Retrying 'FindPackagesByIdAsyncCore' for source 'https://nuget.yoursite.com/nuget/FindPackagesById()?id='FM.Redis''.
Password decryption is not supported on .NET Core for this platform. The following feed uses an encrypted password: 'yourNuget'. You can use a clear text password as a workaround.
Encryption is not supported on non-Windows platforms.
其实是刚才通过nuget添加的认证信息是加密了,直接复制过来dotnet cli是无法使用的Encryption is not supported on non-Windows platforms.
查找得知配置里的认证信息应该是这样的节点,修改下nuget.config 节点yourNugetName ,ClearTextPassword 和username以及相应的值
<packageSourceCredentials>
<yourNugetName>
<add key="Username" value="localTFSUser" />
<add key="ClearTextPassword" value="password" />
</yourNugetName>
</packageSourceCredentials>
我的配置如下~/.nuget/NuGet/NuGet.Config
现在再执行dotnet restore显示正常了
总结
其实不用搞这么多东西,估计也不需要安装nuget,上面只是记录我的一个探索过程
直接按照以下格式修改~/.nuget/NuGet/NuGet.Config即可
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="https://www.nuget.org/api/v2/" value="https://www.nuget.org/api/v2/" />
<add key="xxxyyy" value="https://nuget.xxxxxxx.com/nuget" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
</packageSources>
<packageSourceCredentials>
<xxxyyy>
<add key="Username" value="xxx" />
<add key="ClearTextPassword" value="xxx" />
</xxxyyy>
</packageSourceCredentials>
</configuration>
ref:
- https://github.com/NuGet/Home/issues/3664
- https://github.com/NuGet/Home/issues/6221
- https://github.com/NuGet/Home/issues/5881