Wait the light to fall

Failed to find dependencies: sqlite:from<native>

焉知非鱼

Failed to find dependencies

问题

今天想试一下 Raku 中的一个终端框架, 名字为 Vikna。但是这个模块在标准的 Rakudo 中还不能运行(截至 2020.07 月版)。只能安装特定分支的 Rakudo, 但是安装 Rakudo 的时候, 由于众所周知的网络原因, 在终端中克隆代码仓库特别慢, 十几k的速度, 下载不到一半就被服务器中断了, 特别耗费时间。无奈在 ~/.zshrc 中开启代理:

function proxy_on() {
    export no_proxy="localhost,127.0.0.1,localaddress,localdomain.com"
    export http_proxy="http://127.0.0.1:1089"
    export https_proxy=$http_proxy
    echo -e "已开启代理"
}
proxy_on()

function socks_on() {
  # SOCKS5 代理设置
  export no_proxy="localhost,127.0.0.1,localaddress,localdomain.com"
  export http_proxy="socks5://127.0.0.1:1080"
  export https_proxy="socks5://127.0.0.1:1080"
  echo -e "SOCKS5 代理已开启"
}

socks_on()

试了一下速度还行。不知道是哪个配置起的作用。

接下来安装 Vikna 模块的时候, 爆出了如下错误:

Failed to find dependencies: sqlite:from<native>

modules.raku.org 上搜索 sqlite, 发现是名为 DB::SQLite 的模块。

查看 META6.json, 该模块依赖了 NativeLibs, 于是先尝试安装 NativeLibs:

zef install NativeLibs

但是报错了, 它竟然需要安装依赖 DBIish。查看 NativeLibs 的信息:

zef info NativeLibs
- Info for: NativeLibs
- Identity: DBIish:ver<0.6.0>
- Recommended By: Zef::Repository::LocalCache
- Installed: No
Description:	 Database connectivity for Raku
License:	 BSD-2-Clause
Source-url:	 git://github.com/perl6/DBIish.git
Provides: 28 modules
Depends: 1 items

发现了吗? 安装 NativeLibs 实际上就是安装 DBIish! 可能是缓存的原因。所以还是直接用 url 来安装最新的吧:

zef install https://github.com/salortiz/NativeLibs.git

然后 zef install DB::SQLite 还是报同样的错误。我以为是 zef 找不到 sqlite 的 lib 库, 于是在 ~/.zshrc 中加上了 sqlite 库的 PATH 路径:

export PATH="/usr/local/opt/sqlite/bin:$PATH"
export PATH="/usr/local/opt/sqlite/lib:$PATH"

再次 zef install DB::SQLite 还是不行。又建立了软连接, 仍然不行:

ln -s /usr/local/Cellar/sqlite/3.32.3/lib/libsqlite3.0.dylib ~/.raku/lib/libsqlite3.0.dylib
ln -s /usr/local/Cellar/sqlite/3.32.3/lib/libsqlite3.dylib ~/.raku/lib/libsqlite3.dylib

最后发现是 CPAN 没有同步 github 的 META6.json:

CPAN 中的依赖配置如下:

"depends"      : {
        "runtime"  : {
            "requires" : [
                "DB",
                "NativeLibs:ver<0.0.7>:auth<github:salortiz>",
                "sqlite:from<native>"
            ]
        },
        "test" : {
            "requires" : [ "Test", "Test::When" ]
        }
    },

github 中的依赖配置如下:

"depends"      : {
        "runtime"  : {
            "requires" : [
                "DB",
                "NativeLibs:ver<0.0.7>:auth<github:salortiz>",
                "sqlite3:from<native>:ver<0>"
            ]
        },
        "test" : {
            "requires" : [ "Test", "Test::When" ]
        }
    },

可以看到 github 中的 sqlite 依赖已经改为 sqlite3 了。

我有两个 Rakudo, 一个是 2020.07 月版本的, 一个是新安装的 v-dispatchers 版本。不想删除 2020.07 版本的 Rakudo, 于是 zef 安装模块的时候, 又出错了, 它仍然使用了 ~opt/rakudo/, 即 2020.07 版本的 Rakudo(我已经把这个版本的 Rakudo PATH 变量注释了, 并且把 rakudo 的目录名也改了)。但是 zef 会被安装到 ~/opt/rakudo-home/share/perl6/site/bin 下, 所以删除了旧的 rakudo 之后, zef 也会被删除。只能对新安装的 Rakudo 再安装一次 zef:

git clone https://github.com/ugexe/zef.git
cd zef
raku -I. bin/zef install .

安装 LWP::Simple 测试又卡住了:

zef install https://github.com/raku-community-modules/raku-lwp-simple.git 
===> Searching for missing dependencies: MIME::Base64, URI, JSON::Tiny
===> Testing: MIME::Base64:ver<1.2.1>:auth<github:retupmoca>
===> Testing [OK] for MIME::Base64:ver<1.2.1>:auth<github:retupmoca>
===> Testing: URI:ver<0.3.0>
===> Testing [OK] for URI:ver<0.3.0>
===> Testing: JSON::Tiny:ver<1.0>
===> Testing [OK] for JSON::Tiny:ver<1.0>
===> Testing: LWP::Simple:ver<0.106>:auth<github:perl6>
zef --/test https://github.com/raku-community-modules/raku-lwp-simple.git

最后 raku-pod-render 又测试失败, 删除缓存重新安装:

rm -rf ~/.zef/store/raku-pod-render.git

几个小时过去了。Raku 的生态系统工具链还差的很!