Ruby Policy: различия между версиями

Материал из ALT Linux Wiki
(Новая: {{MovedFromFreesourceInfo|AltLinux/Policy/Ruby}} == Ruby Packaging Policy == {| border="1" |- | Статус | Действующая политика с 16 апреля 2008 |- | Ав...)
 
(Revert unauthorized changes)
 
(не показано 11 промежуточных версий 5 участников)
Строка 1: Строка 1:
{{MovedFromFreesourceInfo|AltLinux/Policy/Ruby}}
{{Policy|since_branch=4.1|responsible=[[Участник:SirRaorn|Alexey I. Froloff]]}}
 
== Ruby Packaging Policy ==
 
{| border="1"
|-
|
Статус
|
Действующая политика с 16 апреля 2008
|-
|
Автор
|
[http://freesource.info/wiki//SirRaorn Alexey I. Froloff]
|-
|
Обязательно в
|
4.1 и выше
|-
|
Метабаг
|
пока не создан
|}
 


Правила упаковки модулей и программ на языке Ruby.
Правила упаковки модулей и программ на языке Ruby.


__TOC__
__TOC__


=== Пакет ruby и его обновление ===
=== Пакет ruby и его обновление ===
Строка 36: Строка 9:
Основная часть интерпретатора ruby находится в пакете libruby.  Это библиотека libruby.so.X.Y и каталоги, входящие в <tt>$LOAD_PATH</tt>.
Основная часть интерпретатора ruby находится в пакете libruby.  Это библиотека libruby.so.X.Y и каталоги, входящие в <tt>$LOAD_PATH</tt>.


В системе и в публичном репозитарии может находиться только она версия пакета libruby.
В системе и в публичном репозитории может находиться только одна версия пакета libruby.


При сборке новой версии ruby из-за изменения <tt>$LOAD_PATH</tt> необходимо пересобрать все пакеты, имеющие зависимости (прямые или косвенные) на пакет libruby.
При сборке новой версии ruby из-за изменения <tt>$LOAD_PATH</tt> необходимо пересобрать все пакеты, имеющие зависимости (прямые или косвенные) на пакет libruby.
Строка 48: Строка 21:
Пакеты должны иметь группу Development/Ruby.
Пакеты должны иметь группу Development/Ruby.


Вышесказанное относится к pure-module пакетам, а не end-user программам, написанным на языке ruby (например alexandria).  В этом случае имя и группа пакета должны соответствовать действительности.
Вышесказанное относится к pure-module пакетам, а не end-user программам, написанным на языке ruby (например, alexandria).  В этом случае имя и группа пакета должны соответствовать действительности.


Пакет должен иметь архитектуру noarch если не содержит архитектурно-зависимых компонентов, упаковка ruby не накладывает дополнительных ограничений.
Пакет должен иметь архитектуру noarch, если не содержит архитектурно-зависимых компонентов; упаковка ruby не накладывает дополнительных ограничений.


=== Расположение файлов ===
=== Расположение файлов ===
Строка 62: Строка 35:
<pre>BuildRequires(pre): rpm-build-ruby</pre>
<pre>BuildRequires(pre): rpm-build-ruby</pre>


{| border="1"
{| class="standard"
|-
|-
|
!'''Макрос'''
'''Макрос'''
!'''описание'''
|
'''описание'''
|-
|-
|colspan="2"
!colspan="2" align="center" |''каталоги''
''каталоги''
|-
|-
|
|%ruby_sitearchdir
%ruby_sitearchdir
|%_libdir/ruby/vendor_ruby/$VERSION/$ARCH/
|
%_libdir/ruby/vendor_ruby/$VERSION/$ARCH/
|-
|-
|
|%ruby_sitelibdir
%ruby_sitelibdir
|%_datadir/ruby/vendor_ruby/$VERSION/
|
%_datadir/ruby/vendor_ruby/$VERSION/
|-
|-
|
|%ruby_archdir
%ruby_archdir
|%_libdir/ruby/$VERSION/$ARCH/
|
%_libdir/ruby/$VERSION/$ARCH/
|-
|-
|
|%ruby_libdir
%ruby_libdir
|%_datadir/ruby/$VERSION/
|
%_datadir/ruby/$VERSION/
|-
|-
|
|%ruby_siteincludedir
%ruby_siteincludedir
|/usr/include/ruby/$VERSION/ (изменится в ruby >= 1.9)
|
/usr/include/ruby/$VERSION/ (изменится в ruby >= 1.9)
|-
|-
|
|%ruby_includedir
%ruby_includedir
|/usr/include/ruby/$VERSION/
|
/usr/include/ruby/$VERSION/
|-
|-
|
|%ruby_ri_sitedir
%ruby_ri_sitedir
|%_datadir/ri/$VERSION/site/
|
%_datadir/ri/$VERSION/site/
|-
|-
|colspan="2"
!colspan="2" align="center" |''опции поиска зависимостей''
''опции поиска зависимостей''
|-
|-
|
|%set_ruby_req_method
%set_ruby_req_method
|strict, normal или relaxed
|
strict, normal или relaxed
|-
|-
|
|%add_ruby_lib_path
%add_ruby_lib_path
|добавляет путь для поиска Provides
|
добавляет путь для поиска Provides
|-
|-
|
|%add_ruby_weakprov_path
%add_ruby_weakprov_path
|добавляет путь для поиска "статически слинкованных" модулей (пример использования в пакете ruby-actionpack)
|
добавляет путь для поиска "статически слинкованных" модулей (пример использования в пакете ruby-actionpack)
|-
|-
|colspan="2"
!colspan="2" align="center" |''сборка и установка''
''сборка и установка''
|-
|-
|
|%ruby_vendor
%ruby_vendor
|ruby -rvendor-specific
|
ruby -rvendor-specific
|-
|-
|
|%rdoc
%rdoc
|вызов rdoc (для секции %install) с опциями --ri-site --all
|
вызов rdoc (для секции %indtall) с опциями --ri-site --all
|-
|-
|colspan="2"
!colspan="2" align="center" align="center" |''setup.rb имени Minero Aoki''
''setup.rb имени Minero Aoki''
|-
|-
|
|%_ruby_setup_rb
%_ruby_setup_rb
|путь к setup.rb (по умолчанию setup.rb)
|
путь к setup.rb (по умолчанию setup.rb)
|-
|-
|
|%ruby_setup_rb
%ruby_setup_rb
|%ruby_vendor %_ruby_setup_rb
|
%ruby_vendor %_ruby_setup_rb
|-
|-
|
|%ruby_config
%ruby_config
|%ruby_setup_rb config
|
%ruby_setup_rb config
|-
|-
|
|%ruby_build
%ruby_build
|%ruby_setup_rb setup
|
%ruby_setup_rb setup
|-
|-
|
|%ruby_install
%ruby_install
|%ruby_setup_rb install --prefix=%buildroot
|
%ruby_setup_rb install --prefix=%buildroot
|-
|-
|colspan="2"
!colspan="2" align="center" |''mkmf и extconf.rb''
''mkmf и extconf.rb''
|-
|-
|
|%ruby_configure
%ruby_configure
|%ruby_vendor extconf.rb --ruby=/usr/bin/ruby
|
%ruby_vendor extconf.rb --ruby=/usr/bin/ruby
|-
|-
|colspan="2"
!colspan="2" align="center" |''rake и Rakefile''
''rake и Rakefile''
|-
|-
|
|%rake
%rake
|%ruby_vendor %_bindir/rake
|
%ruby_vendor %_bindir/rake
|-
|-
|
|%rake_install
%rake_install
|DESTDIR=%buildroot %rake install
|
DESTDIR=%buildroot %rake install
|}
|}


=== Зависимости ===
=== Зависимости ===


В пакете rpm-build-ruby (начиная с версии 1:0.0.1-alt1 или в branch/4.1) реализован автоматический поиск зависимостей.  Таким образом все зависимости, поставленные вручную, являются не только бесполезными, но и вредными (за исключением особых случаев).
В пакете rpm-build-ruby (начиная с версии 1:0.0.1-alt1 или в branch/4.1) реализован автоматический поиск зависимостей.  Таким образом, все зависимости, поставленные вручную, являются не только бесполезными, но и вредными (за исключением особых случаев).


Зависимости имеют вид <tt>ruby(ИМЯ/МОДУЛЯ)</tt> и не привязаны к конкретной версии ruby.  Для модулей, расположенных внутри каталогов, входящих в <tt>$LOAD_PATH</tt> дополнительно появляется зависимость на конкретный каталог.  Стандартные каталоги принадлежат пакету libruby.  Это косвенная привязка к версии ruby.  Такие пакеты необходимо пересобрать при изменении версии ruby.
Зависимости имеют вид <tt>ruby(ИМЯ/МОДУЛЯ)</tt> и не привязаны к конкретной версии ruby.  Для модулей, расположенных внутри каталогов, входящих в <tt>$LOAD_PATH</tt> -- дополнительно появляется зависимость на конкретный каталог.  Стандартные каталоги принадлежат пакету libruby.  Это косвенная привязка к версии ruby.  Такие пакеты необходимо пересобрать при изменении версии ruby.


Зависимости, найденные внутри блоков begin/rescue и внутри методов не экспортируются.  Также не экспортируются зависимости, которые невозможно разрешить в имя модуля, например '<tt>require "rake/tasks/#{task}.raketask"</tt>'.
Зависимости, найденные внутри блоков begin/rescue и внутри методов, не экспортируются.  Также не экспортируются зависимости, которые невозможно разрешить в имя модуля; например, '<tt>require "rake/tasks/#{task}.raketask"</tt>'.


В случае "маскирования" зависимостей в коде (например при помощи блока begin/rescue) мантейнер пакета должен самостоятельно принять решение, убрать "маскировку" патчем, добавить в спек <tt>Requires: ruby(ИМЯ/МОДУЛЯ)</tt> или оставить всё как есть в зависимости от величины ущерба для функциональности пакета.
В случае "маскирования" зависимостей в коде (например, при помощи блока begin/rescue) мантейнер пакета должен самостоятельно принять решение -- убрать "маскировку" патчем, добавить в спек <tt>Requires: ruby(ИМЯ/МОДУЛЯ)</tt> или оставить всё как есть -- в зависимости от величины ущерба для функциональности пакета.


Автоматический поиск зависимостей не отслеживает изменение <tt>$LOAD_PATH</tt>, в этих случаях надо вручную добавить необходимые каталоги к путям поиска при помощи макроса <tt>%add_ruby_lib_path</tt>.
Автоматический поиск зависимостей не отслеживает изменение <tt>$LOAD_PATH</tt>, в этих случаях надо вручную добавить необходимые каталоги к путям поиска при помощи макроса <tt>%add_ruby_lib_path</tt>.
Строка 206: Строка 130:


Есть мнение, неоднократно доказанное экспериментально, что любой пакет можно отучить требовать rubygems без ущерба для его функциональности.
Есть мнение, неоднократно доказанное экспериментально, что любой пакет можно отучить требовать rubygems без ущерба для его функциональности.
[[Категория:Ruby]]

Текущая версия от 13:17, 29 января 2019

Stamp90cw.png
Действующая политика Sisyphus

Политика действует, начиная со стабильного бранча 4.1 и выше.

Ответственный за проведение политики в жизнь — Alexey I. Froloff.


Правила упаковки модулей и программ на языке Ruby.

Пакет ruby и его обновление

Основная часть интерпретатора ruby находится в пакете libruby. Это библиотека libruby.so.X.Y и каталоги, входящие в $LOAD_PATH.

В системе и в публичном репозитории может находиться только одна версия пакета libruby.

При сборке новой версии ruby из-за изменения $LOAD_PATH необходимо пересобрать все пакеты, имеющие зависимости (прямые или косвенные) на пакет libruby.

Внешний вид пакетов

Пакеты должны иметь префикс "ruby-". Если оригинальное название не включает этот префикс, он добавляется к имени пакета, например rcairo -> ruby-rcairo. Исключение составляют пакеты, оригинальное название которых содержит постфикс "-ruby", например "sqlite3-ruby".

Префикс "ruby-module-" является излишним и допустим только для модулей, собирающихся из пакета ruby.

Пакеты должны иметь группу Development/Ruby.

Вышесказанное относится к pure-module пакетам, а не end-user программам, написанным на языке ruby (например, alexandria). В этом случае имя и группа пакета должны соответствовать действительности.

Пакет должен иметь архитектуру noarch, если не содержит архитектурно-зависимых компонентов; упаковка ruby не накладывает дополнительных ограничений.

Расположение файлов

Все модули, которые могут использоваться в "обычной программе на языке ruby", должны помещать свои файлы в так называемые "vendor dirs", описываемые макросами %ruby_sitelibdir и %ruby_sitearchdir. Каталоги %ruby_libdir и %ruby_archdir используются исключительно для модулей, собирающихся из пакета ruby.

Макросы RPM

Макросы находятся в пакете rpm-build-ruby. Рекомендуется добавить в spec строчку:

BuildRequires(pre): rpm-build-ruby
Макрос описание
каталоги
%ruby_sitearchdir %_libdir/ruby/vendor_ruby/$VERSION/$ARCH/
%ruby_sitelibdir %_datadir/ruby/vendor_ruby/$VERSION/
%ruby_archdir %_libdir/ruby/$VERSION/$ARCH/
%ruby_libdir %_datadir/ruby/$VERSION/
%ruby_siteincludedir /usr/include/ruby/$VERSION/ (изменится в ruby >= 1.9)
%ruby_includedir /usr/include/ruby/$VERSION/
%ruby_ri_sitedir %_datadir/ri/$VERSION/site/
опции поиска зависимостей
%set_ruby_req_method strict, normal или relaxed
%add_ruby_lib_path добавляет путь для поиска Provides
%add_ruby_weakprov_path добавляет путь для поиска "статически слинкованных" модулей (пример использования в пакете ruby-actionpack)
сборка и установка
%ruby_vendor ruby -rvendor-specific
%rdoc вызов rdoc (для секции %install) с опциями --ri-site --all
setup.rb имени Minero Aoki
%_ruby_setup_rb путь к setup.rb (по умолчанию setup.rb)
%ruby_setup_rb %ruby_vendor %_ruby_setup_rb
%ruby_config %ruby_setup_rb config
%ruby_build %ruby_setup_rb setup
%ruby_install %ruby_setup_rb install --prefix=%buildroot
mkmf и extconf.rb
%ruby_configure %ruby_vendor extconf.rb --ruby=/usr/bin/ruby
rake и Rakefile
%rake %ruby_vendor %_bindir/rake
%rake_install DESTDIR=%buildroot %rake install

Зависимости

В пакете rpm-build-ruby (начиная с версии 1:0.0.1-alt1 или в branch/4.1) реализован автоматический поиск зависимостей. Таким образом, все зависимости, поставленные вручную, являются не только бесполезными, но и вредными (за исключением особых случаев).

Зависимости имеют вид ruby(ИМЯ/МОДУЛЯ) и не привязаны к конкретной версии ruby. Для модулей, расположенных внутри каталогов, входящих в $LOAD_PATH -- дополнительно появляется зависимость на конкретный каталог. Стандартные каталоги принадлежат пакету libruby. Это косвенная привязка к версии ruby. Такие пакеты необходимо пересобрать при изменении версии ruby.

Зависимости, найденные внутри блоков begin/rescue и внутри методов, не экспортируются. Также не экспортируются зависимости, которые невозможно разрешить в имя модуля; например, 'require "rake/tasks/#{task}.raketask"'.

В случае "маскирования" зависимостей в коде (например, при помощи блока begin/rescue) мантейнер пакета должен самостоятельно принять решение -- убрать "маскировку" патчем, добавить в спек Requires: ruby(ИМЯ/МОДУЛЯ) или оставить всё как есть -- в зависимости от величины ущерба для функциональности пакета.

Автоматический поиск зависимостей не отслеживает изменение $LOAD_PATH, в этих случаях надо вручную добавить необходимые каталоги к путям поиска при помощи макроса %add_ruby_lib_path.

Rubygems

Зависимость на rubygems является недистрибутивной, поскольку скрывает реальные зависимости. Зависимости пакетов должны разрешаться пакетами.

Есть мнение, неоднократно доказанное экспериментально, что любой пакет можно отучить требовать rubygems без ущерба для его функциональности.