前言

最近把很多项目都迁移到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

file

可以看到packageSourceCredentials节点的密码是默认使用加密的

然后在项目是执行dotnet restore看下是不是可以了

file

恭喜你,私源的包完成装不上

想了好久没想通,不是刚把源添加了么,WTF

后来在github溜达一圈有点发现:https://github.com/NuGet/Home/issues/6221

大概是说当执行dotnet restore命令的时候,实际上读取的配置居然是~/.nuget/NuGet/NuGet.Config

这个配置目前看起来是这样的

file

也就是说刚才我们使用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

file

现在再执行dotnet restore显示正常了

file

总结

其实不用搞这么多东西,估计也不需要安装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