× К оглавлению На главную Об авторе

   Дата и время публикации:

Назначение и использование

1. Назначение

1.1 Общие положения

Язык программирования Ruby остается пока одним из самых востребованных языков программирования [3.1], который наряду с Python имеет свой менеджер пакетов RubyGems.

Но, перед тем, как окунутся в атмосферу окружения Ruby пополним свой словарный запас новыми техническими терминами.

Gem — пакет программного обеспечения RubyGems, содержащий приложение или библиотеку, написанную, на языке верхнего уровня Ruby. Каждый подобный пакет имеет имя, версию и определен своей платформе. Так к примеру пакет rake имеет версию 0.8.7 (выпущена в мае 2009 года), платформой является Ruby, что означает, что эта программа может работать только на платформе Rubу [3.4].

RubyGems — система управления пакетами для программного обеспечения, которая является утилитой для установки, создания, управления и загрузкой этих пакетов в собственном окружении Rubу из репозитария, который находится на сайте RubyGems.org [3.5].

rake — реализация подобной Make программы в Ruby. Задачи (цели сборки) и зависимости указываются в стандартном синтаксисе Ruby, который является простым и наделен гибким правилами для реализации задач и удовлетворения зависимостей выполняемых задач.

ri — пользовательский интерфейс доступа к API Ruby

ruby — интерпретатор объектно-ориентированного язык создания сценариев, на момент первой публикации статьи минимальной версией являлся Ruby-1.9, в то время , как c Debian/Bulseye отгружалась версия Ruby-2.7

1.2 Архитектура управления Ruby

Состоит из следующих программных компонентов [3.8], в порядке следования (снизу — вверх) :

Все вышеперечисленные компоненты системы управления пакетами Ruby реализуются через внешний интерфейс пользователя, утилиты gem, которая посредством команд обеспечивает пользовательский доступ к ним.

1.3 Структура пакета Gem

Ruby — это рубин, если дословно перевести на Русский язык, поэтому реализованные в конечном итоге программы и библиотеки на нем в виде конечных пакетов, называются Gems

Gems в переводе на Русский язык — это ограненные и блистающие своей чистотой камени — для получения которых нужно вложить не мало труда, также как в отлично и качественно работающую без сбоев программное обеспечение, реализуемое в виде программы и/или библиотеки.

Все установленные gem-пакеты, находятся в одной из локальных директорий системы и являются частью окружения Ruby, перечень которых можно получить с использованием интерфейса пользователя gem [2.2.1].

Каждый gem-пакет имеет имя, версию [2.2.2] и свою платформ [2.2.3]. Для примера, возьмем устанавливаемый gem-пакет travis [2.2.4] , структура которого показана в дампе 1.3.1, и рассмотрим в ней ключевые файлы и директории.

Дамп 1.3.1

~$ exa --tree -L2 /var/lib/gems/2.7.0/gems/travis-1.10.0/
/var/lib/gems/2.7.0/gems/travis-1.10.0
├── assets
│  ├── cacert.pem
│  ├── init
│  ├── notifications
│  ├── travis.sh
│  └── travis.sh.erb
├── bin
│  └── travis
├── examples
│  ├── org_overview.rb
│  ├── pro_auth.rb
│  └── stream.rb
├── lib
│  ├── travis
│  └── travis.rb
├── LICENSE
├── Rakefile
├── README.md
├── spec
│  ├── cli
│  ├── client
│  ├── client_spec.rb
│  ├── pro_spec.rb
│  ├── spec_helper.rb
│  ├── support
│  └── travis_spec.rb
└── travis.gemspec

В котором разберем основные файлы и директории:

Директория bin/ обычно содержит скрипты и свой собственный бинарник, используемые для настройки, установки, обновления, развертывания приложения / библиотеки, реализованные Ruby, который является основополагющим программным компонентом в этой цепочке. В данном случае, пакет tarvis в данной директории содержит скрипт запуска, как показано в дампе 1.3.2

Дамп 1.3.2

~$  exa --tree -la  /var/lib/gems/2.7.0/gems/travis-1.10.0/bin/
drwxr-xr-x   - root 12 сен 14:24 /var/lib/gems/2.7.0/gems/travis-1.10.0/bin
.rwxr-xr-x 543 root 12 сен 14:24 └── travis
~$ file /var/lib/gems/2.7.0/gems/travis-1.10.0/bin/travis 
/var/lib/gems/2.7.0/gems/travis-1.10.0/bin/travis: Ruby script, ASCII text executable

Жирным в дампе 1.3.2 выделены интересующие значения выдаваемые на STDOUT утилитами exa и file, правила запуска которых также выделены жирным.

Директория examples/ содержит примеры использования gem-пакета travis в качестве подключаемого модуля.

Директория lib/ содержит библиотечные модули, содержащие код основной, базовой функциональности приложения travis. В данном случае, в корне директории lib , находятся сразу несколько модулей, которые подгружаются в файле travis.rb, листинг которого показан в дампе 1.3.3

Дамп 1.3.3

module Travis
  autoload :Client,   'travis/client'
  autoload :CLI,      'travis/cli'
  autoload :Pro,      'travis/pro'
  autoload :Version,  'travis/version'

  include Client::Namespace.new(Client::ORG_URI)
end

Который указывает, где искать и по какому пути (относительно корневой директории lib/) подключаемые модули Client, CLI, Pro и Version [3.15].

Файл Rakefile определяет выполняемые задачи командой Rake, которые перечислены в дампе 1.3.4

Дамп 1.3.4

/var/lib/gems/2.7.0/gems/travis-1.10.0$ rake -T
rake build            # Build travis-1.10.0.gem into the pkg directory
rake build:checksum   # Generate SHA512 checksum if travis-1.10.0.gem into the checksums directory
rake clean            # Remove any temporary products
rake clobber          # Remove any generated files
rake install          # Build and install travis-1.10.0.gem into system gems
rake install:local    # Build and install travis-1.10.0.gem into system gems without network access
rake release[remote]  # Create tag v1.10.0 and build and push travis-1.10.0.gem to rubygems.org
rake spec             # run specs
rake update           # generate gemspec, update readme

И обеспечивают сборку gem-пакета, различные виды сборки и установки, обновление и тестирование.

Директория содержит файлы foo_spec.rb, которые называются тестами rspec для вышеперечисленных модулей Client, CLI, Pro и Version [3.16], имена которых подставляются вместо foo, как показано в дампе 1.3.5

Дамп 1.3.5

/var/lib/gems/2.7.0/gems/travis-1.10.0$ exa --tree -L1 spec
spec
├── cli
├── client
├── client_spec.rb
├── pro_spec.rb
├── spec_helper.rb
├── support
└── travis_spec.rb

rspec – тестовый набор утилит для Ruby, созданный в целях разработки через реализацию поведения (behavior-driven development,BDD) и является наиболее часто используемой библиотекой тестирования Ruby при производстве и выпуску приложений [3.17].

2. Решение

2.1 Установка требуемого программного обеспечения

В дистрибутиве Debian/Bullseye (являющийся стабильным на момент первой публикции) требуется установить следующие пакеты программного обеспечения :

ruby — данный пакет предоставляет интерпретатор объектно-ориентированного языка создания сценариев Ruby;

ruby-rubygems — устанавливает необходимые файлы исполнительной части программного компонента RubyGems, который является в свою очередь клиентом, отвечающий за создание gem-пакетов в глобальном репозитарии RubyGems.org; при этом программный компонент Bundler и внешний интерфейс пользователя, уилита gem устанавливаются вместе с пакетом ruby

rbenv — пакет устанавливает компонент Rbenv

ruby-all-dev — мета-пакет устанавливающий окружение разработчика в соответствие с установленной версией интерпретатора Ruby и содержащий необходимые заголовочные файлы для компиляции модулей расширения.

build-essential — этот мета-пакет устанавливается дополнительно и содержит необходимый перечень пакетов, который устанавливает базовый набор разработчика программного обеспечения, разрабатываемого в окружении компилятора GCC

Поэтому вся процедура установки должна производится в двух этапов, первый из которых показан в дампе 2.1.1

Дамп 2.1.1

~$ sudo apt update && sudo apt install rubygems build-essential
...
Будут установлены следующие дополнительные пакеты:
  fonts-lato libruby2.7 rake ruby-minitest ruby-net-telnet ruby-power-assert ruby-rubygems ruby-test-unit ruby-xmlrpc ruby2.7 rubygems-integration
Предлагаемые пакеты:
  ri ruby-dev bundler
Следующие НОВЫЕ пакеты будут установлены:
  fonts-lato libruby2.7 rake ruby ruby-minitest ruby-net-telnet ruby-power-assert ruby-rubygems ruby-test-unit ruby-xmlrpc ruby2.7 rubygems-integration
Обновлено 0 пакетов, установлено 12 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 8 217 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 33,1 MB.
Хотите продолжить? [Д/н] 
...

Как показано в дампе 2.1.1, в результате выполнения процедуры установки программного обеспечения были установлены следующие deb-пакеты : fonts-lato, libruby2.7, rake, ruby, ruby-minitest, ruby-net-telnet, ruby-power-assert, ruby-rubygems, ruby-test-unit, ruby-xmlrpc, ruby2.7, rubygems-integration

Второй и заключительный этап установки пакетов rbenv и ruby-all-dev, как показано в дампе 2.1.2

Дамп 2.1.2

~$ sudo apt update && sudo apt install rbenv и ruby-all-dev
...
Будут установлены следующие дополнительные пакеты:
  libreadline-dev libsqlite3-dev ruby-build ruby2.7-dev ruby2.7-doc
Предлагаемые пакеты:
  readline-doc sqlite3-doc
Следующие НОВЫЕ пакеты будут установлены:
  libreadline-dev libsqlite3-dev rbenv ruby-all-dev ruby-build ruby2.7-dev ruby2.7-doc
..

Как показано в дампе 2.1.2, в результате будут установлены deb-пакты libreadline-dev, libsqlite3-dev, rbenv, ruby-all-dev, ruby-build, ruby2.7-dev, ruby2.7-doc, реализующие необходимую функциональность по созданию, управлению и установки gem-пакетов

2.2 Использование Gem

2.2.1 Получение информации о локальном размещении gem-пакетов и из глобального репозитария RubyGems.org

Выполнить команду gem environment, в результате чего будет получена информация о локальном размещении gem-пакетов, как показано в дампе 2.2.1

Дамп 2.2.1

user@home2:~$ gem environment
RubyGems Environment:
...
  - INSTALLATION DIRECTORY: /var/lib/gems/2.7.0
...
  - GEM PATHS:
     - /var/lib/gems/2.7.0
     - /home/user/.local/share/gem/ruby/2.7.0
     - /usr/local/lib/ruby/gems/2.7.0
     - /usr/lib/ruby/gems/2.7.0
     - /usr/lib/x86_64-linux-gnu/ruby/gems/2.7.0
     - /usr/share/rubygems-integration/2.7.0
     - /usr/share/rubygems-integration/all
     - /usr/lib/x86_64-linux-gnu/rubygems-integration/2.7.0
...

Где показана выдача в секции GEM PATHS всех возможных вариантов абсолютных путей, которые могут быть использованы для размещения gem-пакетов в RubyGems — менеджером управления ими. При этом, фактический рабочий путь,где размещаются gem-пакеты, отображен в секции INSTALLATION DIRECTORY [3.13].

2.2.2 Получение информации о gem-пакетов из локального и глобального репозитария RubyGems.org

Для получения информации о пакете возпользуйтесь командой info, передаваемой в первом аргументе к утилите gem, во втором — имя gem-пакета, в третьем опционально из каких источников черпать информацию, которую можно получить из удаленного источника (--remote) и локального источника (--local).

Пример получения информации из пакета показано в дампе 2.2.2

Дамп 2.2.1

~$ sudo gem info travis --both
[sudo] пароль для user: 

*** LOCAL GEMS ***

travis (1.10.0)
    Authors: Konstantin Haase, Hiro Asari, Henrik Hodne,
    joshua-anderson, Aaron Hill, Piotr Milcarz, Buck Doyle, Peter
    Souter, Christopher Grim, Joe Corcoran, Peter van Dijk, Sven Fuchs,
    Aakriti Gupta, Josh Kalderimis, Piotr Sarnacki, Ke Zhu, Max Barnash,
    Renée Hendricksen, carlad, Carlos Palhares, Dan Buch, María de
    Antón, Mathias Meyer, Matt Toothman, mariadeanton, techgaun, Alpha,
    Andreas Tiefenthaler, Beau Bouchard, Corinna Wiesner, David
    Rodríguez, Eugene, Eugene Shubin, Igor Wiedler, Ivan Pozdeev, Joep
    van Delft, Stefan Nordhausen, Thais Camilo and Konstantin Haase,
    Tobias Bieniek, Adam Baxter, Adam Lavin, Adrien Brault, Alfie John,
    Aloïs Thévenot, Basarat Ali Syed, Benjamin Manns, Christian Höltje,
    Dani Hodovic, Daniel Chatfield, Dominic Jodoin, Eli Schwartz, Eric
    Herot, Eugene K, George Millo, Gunter Grodotzki, Harald Nordgren,
    HaraldNordgren, Igor, Iulian Onofrei, Jacob Atzen, Jacob Burkhart,
    James Nylen, Joe Rafaniello, Jon-Erik Schneiderhan, Jonas Chromik,
    Jonne Haß, Julia S.Simon, Justin Lambert, Laurent Petit, Maarten van
    Vliet, Marco Craveiro, Mario Visic, Matt, Matteo Sumberaz, Matthias
    Bussonnier, Michael Mior, Michael S. Fischer, Miro Hrončok, Neamar,
    Nero Leung, Nicolas Bessi (nbessi), Nikhil Owalekar, Peter
    Bengtsson, Peter Drake, Raphaël Pinson, Rob Hoelz, Robert Grider,
    Robert Van Voorhees, Simon Cropp, Tahsin Hasan, Titus, Titus Wormer,
    Tobias Wilken, Zachary Gershman, Zachary Scott, designerror, ia,
    jeffdh, john muhl, slewt
    Homepage: https://github.com/travis-ci/travis.rb
    License: MIT
    Installed at: /var/lib/gems/2.7.0

    Travis CI client

*** REMOTE GEMS ***

travis (1.10.0)
    Authors: Konstantin Haase, Hiro Asari, Henrik Hodne,
    joshua-anderson, Aaron Hill, Piotr Milcarz, Buck Doyle, Peter
    Souter, Christopher Grim, Joe Corcoran, Peter van Dijk, Sven Fuchs,
    Aakriti Gupta, Josh Kalderimis, Piotr Sarnacki, Ke Zhu, Max Barnash,
    Renée Hendricksen, carlad, Carlos Palhares, Dan Buch, María de
    Antón, Mathias Meyer, Matt Toothman, mariadeanton, techgaun, Alpha,
    Andreas Tiefenthaler, Beau Bouchard, Corinna Wiesner, David
    Rodríguez, Eugene, Eugene Shubin, Igor Wiedler, Ivan Pozdeev, Joep
    van Delft, Stefan Nordhausen, Thais Camilo and Konstantin Haase,
    Tobias Bieniek, Adam Baxter, Adam Lavin, Adrien Brault, Alfie John,
    Aloïs Thévenot, Basarat Ali Syed, Benjamin Manns, Christian Höltje,
    Dani Hodovic, Daniel Chatfield, Dominic Jodoin, Eli Schwartz, Eric
    Herot, Eugene K, George Millo, Gunter Grodotzki, Harald Nordgren,
    HaraldNordgren, Igor, Iulian Onofrei, Jacob Atzen, Jacob Burkhart,
    James Nylen, Joe Rafaniello, Jon-Erik Schneiderhan, Jonas Chromik,
    Jonne Haß, Julia S.Simon, Justin Lambert, Laurent Petit, Maarten van
    Vliet, Marco Craveiro, Mario Visic, Matt, Matteo Sumberaz, Matthias
    Bussonnier, Michael Mior, Michael S. Fischer, Miro Hrončok, Neamar,
    Nero Leung, Nicolas Bessi (nbessi), Nikhil Owalekar, Peter
    Bengtsson, Peter Drake, Raphaël Pinson, Rob Hoelz, Robert Grider,
    Robert Van Voorhees, Simon Cropp, Tahsin Hasan, Titus, Titus Wormer,
    Tobias Wilken, Zachary Gershman, Zachary Scott, designerror, ia,
    jeffdh, john muhl, slewt
    Homepage: https://github.com/travis-ci/travis.rb

    Travis CI client

Так, как показано в дампе 2.2.2, на примере gem-пакета travis, получать подобную информацию можно из обоих источников, воспользовавшись опцией --both, что позволит сравнивать установленную локально версию gem-пакета и находящуюся удаленно в репозитарии RubyGems.org

2.2.3 Получение информации о текущей платформе

Для получения сведений о текущей платформе следует выполнить команду gem environment, пример выполнения которой показан в дампе 2.2.3а .

Дамп 2.2.3а

~$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 3.2.5
  - RUBY VERSION: 2.7.4 (2021-07-07 patchlevel 191) [x86_64-linux-gnu]
  - INSTALLATION DIRECTORY: /var/lib/gems/2.7.0
  - USER INSTALLATION DIRECTORY: /home/user/.local/share/gem/ruby/2.7.0
  - RUBY EXECUTABLE: /usr/bin/ruby2.7
  - GIT EXECUTABLE: /usr/bin/git
  - EXECUTABLE DIRECTORY: /usr/local/bin
  - SPEC CACHE DIRECTORY: /home/user/.local/share/gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /etc
  - RUBYGEMS PLATFORMS:
     - ruby
     - x86_64-linux
...

Платформы RubyGems состоят из трех частей из архитектуры процессора – #{cpu}, операционной системы – #{os} и версии – #{version}, которые образуют следующие допустимые выражения: #{cpu}–#{os}, #{cpu}–#{os}–#{version}, как было показано в дампе 2.2.3: первое из них #{cpu}–#{os} в секции RUBYGEMS PLATFORMSx86_64-linux, при этом для получения только локальной платформы следует выполнить отдельную команду в интерпертаторе Ruby, как показано в дампе 2.2.3б

Дамп 2.2.3б

~$ ruby -e 'puts Gem::Platform.local'
x86_64-linux

которой, как уже было показано ранее, является x86_64-linux, состоящей из значения x86 архитектуры процессора #{cpu} и значения linux операционной системы #{os}. При этом версия #{version} в данном случае не используется.

2.2.4 Установка gem-пакета

Установка недостающего пакета производится командой gem, как показано в дампе 2.2.4a

Дамп 2.2.3а

~$ sudo gem install travis
Fetching public_suffix-4.0.6.gem
Fetching launchy-2.4.3.gem
Fetching highline-2.0.3.gem
Fetching websocket-1.2.9.gem
Fetching pusher-client-0.6.2.gem
Fetching addressable-2.8.0.gem
Fetching json_pure-2.5.1.gem
Fetching net-http-pipeline-1.0.1.gem
Fetching net-http-persistent-2.9.4.gem
Fetching ruby2_keywords-0.0.5.gem
Fetching multipart-post-2.1.1.gem
Fetching faraday-rack-1.0.0.gem
Fetching faraday-patron-1.0.0.gem
Fetching faraday-net_http_persistent-1.2.0.gem
Fetching faraday-net_http-1.0.1.gem
Fetching multi_json-1.15.0.gem
Fetching faraday-httpclient-1.0.1.gem
Fetching faraday-excon-1.1.0.gem
Fetching faraday-em_synchrony-1.0.0.gem
Fetching faraday-em_http-1.0.0.gem
Fetching faraday-1.7.1.gem
Fetching faraday_middleware-1.1.0.gem
Fetching thread_safe-0.3.6.gem
Fetching tzinfo-1.2.9.gem
Fetching concurrent-ruby-1.1.9.gem
Fetching travis-1.10.0.gem
Fetching i18n-1.8.10.gem
Fetching activesupport-5.2.6.gem
Fetching gh-0.18.0.gem
…
Installing ri documentation for i18n-1.8.10
Parsing documentation for activesupport-5.2.6
Installing ri documentation for activesupport-5.2.6
Parsing documentation for gh-0.18.0
Installing ri documentation for gh-0.18.0
Parsing documentation for travis-1.10.0
Installing ri documentation for travis-1.10.0
Done installing documentation for websocket, pusher-client, public_suffix, addressable, launchy, json_pure, highline, net-http-pipeline, net-http-persistent, multi_json, ruby2_keywords, multipart-post, faraday-rack, faraday-patron, faraday-net_http_persistent, faraday-net_http, faraday-httpclient, faraday-excon, faraday-em_synchrony, faraday-em_http, faraday, faraday_middleware, thread_safe, tzinfo, concurrent-ruby, i18n, activesupport, gh, travis after 60606 seconds

Как показано в дампе 2.2.4а, установка была производена в фактически рабочую директорию, куда устанавливаются gem-пакеты. Поэтому в случае запуска процедуры установки от лица непривилегированного пользователя, утилита gem возвратит ошибку с отсутствием прав доступа по записи, как показано в дампе 2.2.4б

Дамп 2.2.3а

~$ sudo gem install travis
...
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /var/lib/gems/2.7.0 directory.

Потому что писать в INSTALLATION DIRECTORY может только привеллигированный пользователь. В данном случае, суперпользователь или подьзователь наделенный такими правами, как показано в дампе 2.2.4а, с использованием утилиты sudo(8).

2.2.5 Обновление gem-пакетов RubyGems

Рано или поздно наступит время обновление gem-пакетов. Для отдельного пакета travis это процедура выполняется, как показано в дампе 2.2.5а

Дамп 2.2.5а

~$ gem update travis

При этом в Debian/Bullseye (применяемая мной замороженная версия на момент первой публикации) основное ядро gem-пакетов обновляется командой apt upgrade . Поэтому любая попытка в нем выполнить команду gem update --system обернется аврийным завершением, как показано в дампе 2.2.5б

Дамп 2.2.5б

 
~$ sudo gem update --system
...
ERROR:  Your RubyGems was installed trough APT, and upgrading it through RubyGems
itself is unsupported. If you really need the latest version of RubyGems (tip:
you usually don't), then you need to install RubyGems (and Ruby) manually,
maybe using tools like ruby-install, rvm, etc.

3. Библиография

3.1 The 10 Most In-demand Programming Languages in 2021

3.2 Understanding How Rbenv, RubyGems And Bundler Work Together

3.3 RubyGems Guides

3.4 RubyGems Guides.what-is-a-gem

3.5 rubygems - project on GitHub

3.6 RubyGems Guides. Command rake

3.7 RubyGems Guides. RubyGems basics

3.8 Understanding How Rbenv, RubyGems And Bundler Work Together

3.9 What is Monkey patch

3.10 Understanding ruby load, require, gems, bundler and rails autoloading from the bottom up

3.11 Ruby Doc. Method: Kernel#require

3.12 RubyGems Guides. Gem environment

3.13 How to find where gem files are installed

3.14 Ruby Cookbook: Modules and Namespaces

3.15 RubyFlow. The autoload Method in Ruby

3.16 What are "specs" for in Ruby gems?

3.17 Getting Started with RSpec

3.18 How to upgrade rubygems