如何使用具有本机扩展的Nix构建Ruby Gem
我正在尝试为如何使用具有本机扩展的Nix构建Ruby Gem,ruby,nix,Ruby,Nix,我正在尝试为rails构建一个bundlerEnv。不知何故,Nix知道nokogiri(rails的依赖项)需要zlib、libxml2和libxslt,但编译失败 #Gemfile gem "rails" 不幸的是,运行find/nix-name mkmf.log失败。但是使用Nix环境手动配置nokogiri成功()我很幸运有这样的配置: with import <nixpkgs>{}; let bundler_ = bundler.override { ru
rails
构建一个bundlerEnv
。不知何故,Nix知道nokogiri
(rails的依赖项)需要zlib
、libxml2
和libxslt
,但编译失败
#Gemfile
gem "rails"
不幸的是,运行
find/nix-name mkmf.log
失败。但是使用Nix环境手动配置nokogiri成功()我很幸运有这样的配置:
with import <nixpkgs>{};
let
bundler_ = bundler.override {
ruby = ruby_2_3;
};
bundix_ = bundix.override {
bundler = bundler_;
};
gems = bundlerEnv {
name = "company-bundler";
inherit ruby_2_3;
gemfile = ./Gemfile;
lockfile = ./Gemfile.lock;
gemset = ./gemset.nix;
};
in
stdenv.mkDerivation rec {
name = "company-tools";
version = "0.1.0";
buildInputs = [
# Ruby
ruby_2_3
bundler_
bundix_
rake
gems
# Nokogiri
libiconv
libxml2
libxslt
zlib
];
shellHook = ''
# use a Gem directory within nix
export GEM_HOME=$out/.gems
export PATH=$out/.gems/bin:$PATH
# For nokogiri
export XSLT_LIB=${stdenv.lib.makeLibraryPath [ libxslt ]}
bundle config build.nokogigi --with-xslt-lib=$XSLT_LIB
'';
}
与导入{};
让
bundler=bundler.override{
ruby=ruby_2_3;
};
bundix=bundix.override{
捆扎机=捆扎机;
};
gems=bundlerEnv{
name=“公司捆绑机”;
继承ruby_2_3;
gemfile=./gemfile;
lockfile=./Gemfile.lock;
gemset=./gemset.nix;
};
在里面
stdenv.mkrec{
name=“公司工具”;
version=“0.1.0”;
构建输入=[
#红宝石
ruby_2_3
捆扎机_
邦迪克斯_
耙
宝石
#诺科吉里
它本身
libxml2
libxslt
兹利布
];
壳钩=“”
#在nix中使用Gem目录
导出GEM_HOME=$out/.gems
导出路径=$out/.gems/bin:$PATH
#为nokogiri
导出XSLT_LIB=${stdenv.LIB.makeLibraryPath[libxslt]}
bundle config build.nokogigi——使用xslt lib=$xslt_lib
'';
}
我认为关键点是
XSLT_LIB
var和bundle config
bit——它们基本上都在做同样的事情,但显然没有这个问题。将nokogiri
从1.6.8降级到1.6.7解决了这个问题。
$ nix-build
...
buildFlags: --use-system-libraries --with-zlib-dir=/nix/store/dn9l2kd6ai731k34pzlzr5dz3in0rn31-zlib-1.2.8-dev --with-xml2-lib=/nix/store/9w15hz68wz5qnihfhsbr281d0sfs20a8-libxml2-2.9.3/lib --with-xml2-include=/nix/store/rq94vzxa92p30prfgv9jz83xiy8hkn2k-libxml2-2.9.3-dev/include/libxml2 --with-xslt-lib=/nix/store/fv137j5wxp4dg1wjqdbk8i2l087163b7-libxslt-1.1.28/lib --with-xslt-include=/nix/store/j7y29aggnzmlgh5bccp9f7vmiknh16fm-libxslt-1.1.28-dev/include --with-exslt-lib=/nix/store/fv137j5wxp4dg1wjqdbk8i2l087163b7-libxslt-1.1.28/lib --with-exslt-include=/nix/store/j7y29aggnzmlgh5bccp9f7vmiknh16fm-libxslt-1.1.28-dev/include
WARNING: You build with buildroot.
Build root: /
Bin dir: /nix/store/z26mymfryhqqh7y8w94qr0xc88q46dvr-ruby2.3.1-p0-nokogiri-1.6.8/lib/ruby/gems/2.3.1/bin
Gem home: /nix/store/z26mymfryhqqh7y8w94qr0xc88q46dvr-ruby2.3.1-p0-nokogiri-1.6.8/lib/ruby/gems/2.3.1
...
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
with import <nixpkgs>{};
let
bundler_ = bundler.override {
ruby = ruby_2_3;
};
bundix_ = bundix.override {
bundler = bundler_;
};
gems = bundlerEnv {
name = "company-bundler";
inherit ruby_2_3;
gemfile = ./Gemfile;
lockfile = ./Gemfile.lock;
gemset = ./gemset.nix;
};
in
stdenv.mkDerivation rec {
name = "company-tools";
version = "0.1.0";
buildInputs = [
# Ruby
ruby_2_3
bundler_
bundix_
rake
gems
# Nokogiri
libiconv
libxml2
libxslt
zlib
];
shellHook = ''
# use a Gem directory within nix
export GEM_HOME=$out/.gems
export PATH=$out/.gems/bin:$PATH
# For nokogiri
export XSLT_LIB=${stdenv.lib.makeLibraryPath [ libxslt ]}
bundle config build.nokogigi --with-xslt-lib=$XSLT_LIB
'';
}