gpt4 book ai didi

ruby - 使用 sqlite gem 中的非默认 sqlite3 可执行文件

转载 作者:行者123 更新时间:2023-12-02 04:56:36 28 4
gpt4 key购买 nike

我编译了一个自定义 sqlite3 可执行文件以启用对 ICU 的支持(排序规则:针对 utf-8 使用重音符号排序等)。

我使用rvm并且ruby sqlite gem似乎使用:

~/.rvm/gems/ruby-1.9.3-p392@project/gems/sqlite3-1.3.7/lib/sqlite3/sqlite3_native.so

我的数据库创建代码需要排序规则,因此当我使用 sqlite gem 时出现错误:

/home/user/.rvm/gems/ruby-1.9.3-p392@project/gems/sqlite3-1.3.7/lib/sqlite3/database.rb:91:in `initialize': SQLite3::SQLException: no such function: icu_load_collation (Sequel::DatabaseError)

...这是有道理的,因为默认的 sqlite 没有内置排序规则。

当我直接使用自定义 sqlite3 可执行文件时,一切正常。

我的问题如下:

  1. 有没有办法获得内置 ICU 支持的 sqlite3 debian/ubundu 包?我没找到。

  2. 如果(1)不可能,我是否需要编译 sqlite3 并创建静态库而不是可执行文件?

  3. 如果(2)可行,我该如何正确更改?我使用 bundler 并部署在另一台机器上。

  4. 有没有其他方法可以让 sqlite gem 看到我的 native 可执行文件(或者 .so,如果(2)是可能的)。

提前谢谢您,

K.

最佳答案

我终于成功了。要在使用特定选项编译 native 扩展(例如 ICU 对 sqlite 的支持)时安装 gem,需要执行以下操作:

$ gem install sqlite3 --verbose --                                      \
--with-opt-include=/home/user/local/lib/sqlite-autoconf-3071602/ \
--with-opt-lib=/home/user/local/lib/sqlite-autoconf-3071602/.libs \
--with-cflags='-O3 -DSQLITE_ENABLE_ICU' \
--with-cppflags=`icu-config --cppflags` \
--with-ldflags=`icu-config --ldflags`

两个“空”破折号“--”后面的内容都是用于 gem 构建过程的参数。假设 sqlite3 的 src 发行版在以下位置解压缩:/home/user/local/lib/sqlite-autoconf-3071602/

现在,由于我使用 bundler ,我希望它能够自动化。为此,可以使用以下命令:

bundle config build.sqlite3 --with-opt-include=/home/user/local/lib/sqlite-autoconf-3071602/ ...

...这意味着每当安装 sqlite3 gem 时都会在构建过程中传递以下选项。这会创建一个 ~/.bundle/config 文件,其中包含该 gem 的条目,例如该文件将具有:

BUNDLE_BUILD__SQLITE3: --with-opt-include=/home/karask/local/lib/sqlite-autoconf-3071602/  --with-opt-lib=/home/karask/local/lib/sqlite-autoconf-3071602/.libs  --with-cflags='-O3 -DSQLITE_ENABLE_ICU' --with-cppflags=`icu-config --cppflags` --with-ldflags=`icu-config --ldflags`

但是,这对我来说效果不佳。由于某种原因,~/.bundle/config 中的条目不正确。我尝试了几种组合的引用和转义,但没有成功。最后,我通过添加以下内容在部署过程(shell 脚本)中手动创建此条目:

$ mkdir ~/.bundle
$ echo "BUNDLE_BUILD__SQLITE3: --with-opt-include=/home/user/local/lib/sqlite-autoconf-3071602/ --with-opt-lib=/home/user/local/lib/sqlite-autoconf-3071602/.libs --with-cflags='-O3 -DSQLITE_ENABLE_ICU' --with-cppflags=`icu-config --cppflags` --with-ldflags=`icu-config --ldflags`" > ~/.bundle/config

关于ruby - 使用 sqlite gem 中的非默认 sqlite3 可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16564802/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com