1

カスタム 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)が可能な場合、どうすれば適切に変更できますか? バンドラーを使用し、別のマシンにデプロイします。

  4. sqlite gem にネイティブ実行可能ファイル (または (2) が可能な場合は .so) を表示させる別の方法はありますか。

前もって感謝します、

K.

4

2 に答える 2

1

私はついにそれを機能させました。特定のオプションを使用してネイティブ拡張機能 (sqlite の ICU サポートなど) をコンパイルしながら 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`

2 つの「空の」ダッシュ「--」の後に続くものは、gem のビルド プロセスに使用されるパラメーターです。これは、sqlite3 の src 配布が次の場所で解凍されたことを前提としています。/home/user/local/lib/sqlite-autoconf-3071602/

今、バンドラーを使用しているので、これを自動化したかったのです。これを行うには、次のコマンドを使用できます。

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が正しくありませんでした。いくつかの組み合わせで引用とエスケープを試みましたが、うまくいきませんでした。最後に、デプロイ プロセス (シェル スクリプト) でこのエントリを手動で作成し、次の行を追加します。

$ 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
于 2013-05-19T16:50:44.717 に答える