4.3. rh-ruby23 Software Collection の拡張
Red Hat Software Collections 3.8 では、依存パッケージを追加して rh-ruby23 Software Collection を拡張できます。rh-ruby23 Software Collection が提供する Ruby 2.3 に構築される Ruby on Rails 4.2 (rh-ror42) Software Collection は、このような拡張機能の 1 つです。
本セクションでは、rh-ror42 Software Collection に含まれる rh-ror42-rubygem-bcryptメタパッケージと rh-ror42 パッケージの詳細情報を提供します。
4.3.1. rh-ror42 Software Collection
このセクションでは、rh-ror42 Software Collection の Ruby on Rails 4.2 メタパッケージのコメントされた例を説明します。rh-ror42 Software Collection は、rh-ruby23 Software Collection によって異なります。
rh-ror42 Software Collection のメタパッケージの例を以下に示します。
- rh-ror42 Software Collection の spec ファイルには、以下のビルド依存関係セットがあります。
BuildRequires: %{scl_prefix_ruby}scldevel BuildRequires: %{scl_prefix_ruby}rubygems-devel
これは、rh-ruby23-scldevel、rh-ruby23-rubygems-devel などに展開されます。この rh-ruby23-scldevel サブパッケージには、重要なマクロが 2 つ (%scl_ruby
および%scl_prefix_ruby
) あります。rh-ruby23-scldevel サブパッケージはビルドルートで利用できる必要があります。Ruby Software Collections が複数ある場合は、rh-ruby23-scldevel は、利用可能な Software Collections をどれを使用するかを決定します。%scl_ruby
および%scl_prefix_ruby
マクロは、spec ファイルの上部でも定義されることに注意してください。定義は必須ではありませんが、rh-ror42 Software Collection が rh-ruby23 Software Collection に構築されるように設計されているという視覚的なヒントを提供します。フォールバック値としても機能します。 - rh-ror42-runtime サブパッケージは、依存する Software Collection の runtime サブパッケージに依存する必要があります。この依存関係は以下のように指定されます。
%package runtime Requires: %{scl_prefix_ruby}runtime
パッケージが rh-ruby23 Software Collection に対して構築されると、rh-ruby23-runtimeに展開されます。 - rh-ror42-build サブパッケージは、依存する Software Collection の scldevel サブパッケージに依存する必要があります。これは、この Software Collection の他のすべてのパッケージが同じマクロを定義しているため、同じ Ruby バージョンに対して構築されるようにするためです。
%package build Requires: %{scl_prefix_ruby}scldevel
rh-ruby23 Software Collection の場合には、rh-ruby23-scldevelに展開されます。 - rh-ror42 Software Collection の
enable
スクリプトレットには、以下の行が含まれます。. scl_source enable %{scl_ruby}
行の先頭にあるドットに注意してください。この行では、rh-ror42 Software Collection が起動すると、Ruby Software Collection が暗黙的に開始するため、ユーザーは scl enable rh-ruby23 rh-ror42 command の代わりに、scl enable rh-ror42 command のみを実行して、Software Collection 環境で command を実行できます。 - この rh-ror42-scldevel サブパッケージは、rh-ror42 Software Collection を拡張する Software Collection を構築する必要がある場合は利用できるようにすることができます。このパッケージは、rh-ror42 Software Collection を拡張するために使用できる
%{scl_ror}
および%{scl_prefix_ror}
マクロを提供します。 - rh-ror42 Software Collection の gems は別のルートディレクトリー構造にインストールされるため、rubygems ディレクトリーの正しい所有権が設定されていることを確認する必要があります。これは、スニペットを使用してファイル一覧 rubygems_filesystem.list を生成することで行います。root ファイルシステムに置かれた場合は、別の runtime パッケージが所有するディレクトリーをすべて所有するように設定することが推奨されます。rh-ror42 Software Collection の場合におけるそのようなディレクトリーの 1 つが Rubygem ディレクトリー構造です。
%global scl_name_prefix rh- %global scl_name_base ror %global scl_name_version 41 %global scl %{scl_name_prefix}%{scl_name_base}%{scl_name_version} # Fallback to rh-ruby23. rh-ruby23-scldevel is unlikely to be available in # the build root. %{!?scl_ruby:%global scl_ruby rh-ruby23} %{!?scl_prefix_ruby:%global scl_prefix_ruby %{scl_ruby}-} # Do not produce empty debuginfo package. %global debug_package %{nil} # Support SCL over NFS. %global nfsmountable 1 %{!?install_scl: %global install_scl 1} %scl_package %scl Summary: Package that installs %scl Name: %scl_name Version: 2.0 Release: 5%{?dist} License: GPLv2+ %if 0%{?install_scl} Requires: %{scl_prefix}rubygem-therubyracer Requires: %{scl_prefix}rubygem-sqlite3 Requires: %{scl_prefix}rubygem-rails Requires: %{scl_prefix}rubygem-sass-rails Requires: %{scl_prefix}rubygem-coffee-rails Requires: %{scl_prefix}rubygem-jquery-rails Requires: %{scl_prefix}rubygem-sdoc Requires: %{scl_prefix}rubygem-turbolinks Requires: %{scl_prefix}rubygem-bcrypt Requires: %{scl_prefix}rubygem-uglifier Requires: %{scl_prefix}rubygem-jbuilder Requires: %{scl_prefix}rubygem-spring %endif BuildRequires: help2man BuildRequires: scl-utils-build BuildRequires: %{scl_prefix_ruby}scldevel BuildRequires: %{scl_prefix_ruby}rubygems-devel %description This is the main package for %scl Software Collection. %package runtime Summary: Package that handles %scl Software Collection. Requires: scl-utils # The enable scriptlet depends on the ruby executable. Requires: %{scl_prefix_ruby}ruby %description runtime Package shipping essential scripts to work with %scl Software Collection. %package build Summary: Package shipping basic build configuration Requires: scl-utils-build Requires: %{scl_runtime} Requires: %{scl_prefix_ruby}scldevel %description build Package shipping essential configuration macros to build %scl Software Collection. %package scldevel Summary: Package shipping development files for %scl Provides: scldevel(%{scl_name_base}) %description scldevel Package shipping development files, especially usefull for development of packages depending on %scl Software Collection. %prep %setup -c -T %install %scl_install cat >> %{buildroot}%{_scl_scripts}/enable << EOF export PATH="%{_bindir}:%{_sbindir}\${PATH:+:\${PATH}}" export LD_LIBRARY_PATH="%{_libdir}\${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PATH}}" export MANPATH="%{_mandir}:\${MANPATH:-}" export PKG_CONFIG_PATH="%{_libdir}/pkgconfig\${PKG_CONFIG_PATH:+:\${PKG_CONFIG_PATH}}" export GEM_PATH="\${GEM_PATH:=%{gem_dir}:\`scl enable %{scl_ruby} -- ruby -e "print Gem.path.join(':')"\`}" . scl_source enable %{scl_ruby} EOF cat >> %{buildroot}%{_root_sysconfdir}/rpm/macros.%{scl_name_base}-scldevel << EOF %%scl_%{scl_name_base} %{scl} %%scl_prefix_%{scl_name_base} %{scl_prefix} EOF scl enable %{scl_ruby} - << \EOF set -e # Fake rh-ror42 Software Collection environment. GEM_PATH=%{gem_dir}:`ruby -e "print Gem.path.join(':')"` \ X_SCLS=%{scl} \ ruby -rfileutils > rubygems_filesystem.list << \EOR # Create the RubyGems file system. Gem.ensure_gem_subdirectories '%{buildroot}%{gem_dir}' FileUtils.mkdir_p File.join '%{buildroot}', Gem.default_ext_dir_for('%{gem_dir}') # Output the relevant directories. Gem.default_dirs['%{scl}_system'.to_sym].each { |k, p| puts p } EOR EOF %files %files runtime -f rubygems_filesystem.list %scl_files %files build %{_root_sysconfdir}/rpm/macros.%{scl}-config %files scldevel %{_root_sysconfdir}/rpm/macros.%{scl_name_base}-scldevel %changelog * Thu Jan 16 2015 John Doe <jdoe@example.com> - 1-1 - Initial package.
4.3.2. rh-ror42-rubygem-bcrypt パッケージ
以下は、rh-ror42-rubygem-bcrypt パッケージの spec ファイルのコメントされた例です。このパッケージは、bcrypt Ruby gem を提供します。bcrypt の詳細は、以下の Web サイトを参照してください。
rh-ror42-rubygem-bcrypt パッケージの spec ファイルと通常の Software Collection の spec ファイルの大きな違いは、以下のとおりです。
BuildRequires
タグの接頭辞は、%{scl_prefix}
ではなく、%{?scl_prefix_ruby}
になります。
%{?scl:%scl_package rubygem-%{gem_name}} %{!?scl:%global pkg_name %{name}} %global gem_name bcrypt Summary: Wrapper around bcrypt() password hashing algorithm Name: %{?scl_prefix}rubygem-%{gem_name} Version: 3.1.9 Release: 2%{?dist} Group: Development/Languages # ext/* - Public Domain # spec/TestBCrypt.java - ISC License: MIT and Public Domain and ISC URL: https://github.com/codahale/bcrypt-ruby Source0: http://rubygems.org/downloads/%{gem_name}-%{version}.gem Requires: %{?scl_prefix_ruby}ruby(release) Requires: %{?scl_prefix_ruby}ruby(rubygems) BuildRequires: %{?scl_prefix_ruby}rubygems-devel BuildRequires: %{?scl_prefix_ruby}ruby-devel BuildRequires: %{?scl_prefix}rubygem(rspec) Provides: %{?scl_prefix}rubygem(bcrypt) = %{version} %description bcrypt() is a sophisticated and secure hash algorithm designed by The OpenBSD project for hashing passwords. bcrypt provides a simple, humane wrapper for safely handling passwords. %package doc Summary: Documentation for %{pkg_name} Group: Documentation Requires: %{?scl_prefix}%{pkg_name} = %{version}-%{release} %description doc Documentation for %{pkg_name}. %prep %setup -n %{pkg_name}-%{version} -q -c -T %{?scl:scl enable %{scl} - << \EOF} %gem_install -n %{SOURCE0} %{?scl:EOF} %build %install mkdir -p %{buildroot}%{gem_dir} cp -pa .%{gem_dir}/* \ %{buildroot}%{gem_dir}/ mkdir -p %{buildroot}%{gem_extdir_mri} cp -pa .%{gem_extdir_mri}/* %{buildroot}%{gem_extdir_mri}/ # Prevent a symlink with an invalid target in -debuginfo (BZ#878863). rm -rf %{buildroot}%{gem_instdir}/ext/ %check %{?scl:scl enable %{scl} - << \EOF} pushd .%{gem_instdir} # 2 failutes due to old RSpec # https://github.com/rspec/rspec-expectations/pull/284 rspec -I$(dirs +1)%{gem_extdir_mri} spec |grep '34 examples, 2 failures' || exit 1 popd %{?scl:EOF} %files %dir %{gem_instdir} %exclude %{gem_instdir}/.* %{gem_libdir} %{gem_extdir_mri} %exclude %{gem_cache} %{gem_spec} %doc %{gem_instdir}/COPYING %files doc %doc %{gem_docdir} %doc %{gem_instdir}/README.md %doc %{gem_instdir}/CHANGELOG %{gem_instdir}/Rakefile %{gem_instdir}/Gemfile* %{gem_instdir}/%{gem_name}.gemspec %{gem_instdir}/spec %changelog * Fri Mar 21 2015 John Doe <jdoe@example.com> - 3.1.2-4 - Initial package.
4.3.3. rh-ror42 Software Collection の構築
rh-ror42 Software Collection を構築するには、以下を実行します。
- rh-ruby23 Software Collection に含まれる rh-ruby23-scldevel サブパッケージをインストールします。
rh-ror42.spec
を構築して、ror42-runtime パッケージおよび ror42-build パッケージをインストールします。rubygem-bcrypt.spec
をビルドします。
4.3.4. rh-ror42 Software Collection のテスト
rh-ror42 Software Collection をテストするには、以下を実行します。
- rh-ror42-rubygem-bcrypt パッケージをインストールします。
- 次のコマンドを実行します。
$
scl enable rh-ror42 -- ruby -r bcrypt -e "puts BCrypt::Password.create('my password')"
- 出力に以下の行が含まれることを確認します。
$2a$10$s./ReniLY.wXPHVBQ9npoeyZf5KzywfpvI5lhjG6Ams3u0hKqwVbW