Red Hat Training

A Red Hat training course is available for RHEL 8

5.7. RubyGems 패키지

이 섹션에서는 RubyGems 패키지가 무엇인지, 그리고 RPM으로 다시 패키징하는 방법에 대해 설명합니다.

5.7.1. RubyGems의 정의

Ruby는 동적, 해석, 반사, 객체 지향, 일반 목적의 프로그래밍 언어입니다.

Ruby로 작성된 프로그램은 일반적으로 특정 Ruby 패키징 형식을 제공하는 RubyGems 프로젝트를 사용하여 패키징됩니다.

RubyGems에서 만든 패키지는 gems라고 하며 RPM으로도 다시 패키징할 수 있습니다.

참고

이 문서는 gem 접두사와 함께 RubyGems 개념과 관련된 용어(예: .gemspec)는 gem 사양에 사용되며 RPM 관련 용어는 정규화되지 않습니다.

5.7.2. RubyGems의 RPM 관련 방법

RubyGems는 Ruby의 자체 패키징 형식을 나타냅니다. 그러나 RubyGems에는 RPM에 필요한 메타데이터가 포함되어 있으며 RubyGems에서 RPM으로 변환할 수 있습니다.

Ruby Packaging guidelines 에 따르면 RubyGems 패키지를 RPM으로 다시 패키징할 수 있습니다.

  • 이러한 RPM은 나머지 배포에 적합합니다.
  • 최종 사용자는 적절한 RPM 패키지 gem을 설치하여 gem의 종속성을 충족할 수 있습니다.

RubyGems는 SPEC 파일, 패키지 이름, 종속성 및 기타 항목과 같은 RPM과 유사한 용어를 사용합니다.

나머지 RHEL RPM 배포에 적합하려면 RubyGems에서 생성한 패키지는 아래 나열된 규칙을 따라야 합니다.

  • gems의 이름은 다음 패턴을 따라야 합니다.

    rubygem-%{gem_name}
  • shebang 라인을 구현하려면 다음 문자열을 사용해야 합니다.

    #!/usr/bin/ruby

5.7.3. RubyGems 패키지에서 RPM 패키지 생성

RubyGems 패키지에 대한 소스 RPM을 만들려면 다음 파일이 필요합니다.

  • gem 파일
  • RPM SPEC 파일

다음 섹션에서는 RubyGems에서 만든 패키지에서 RPM 패키지를 만드는 방법에 대해 설명합니다.

5.7.3.1. RubyGems SPEC 파일 규칙

RubyGems SPEC 파일은 다음 규칙을 충족해야 합니다.

  • gem의 사양의 이름인 %{gem_name} 를 포함합니다.
  • 패키지 소스는 릴리스된 gem 아카이브에 대한 전체 URL이어야 합니다. 패키지 버전은 gem의 버전이어야 합니다.
  • 빌드에 필요한 매크로를 가져올 수 있도록 다음과 같이 정의된 지시문인 BuildRequires 가 포함되어 있습니다.

    BuildRequires:rubygems-devel
  • RubyGems Requires 또는 Provides 가 자동으로 생성되기 때문에 포함되어 있지 않습니다.
  • Ruby 버전 호환성을 명시적으로 지정하지 않으려면 다음과 같이 정의된 BuildRequires: 지시문을 포함하지 않습니다.

    Requires: ruby(release)

    RubyGems에 자동으로 생성된 종속성(필수: ruby(rubygems))이면 충분합니다.

5.7.3.2. RubyGems 매크로

다음 표에는 RubyGems에서 만든 패키지에 유용한 매크로가 나열되어 있습니다. 이러한 매크로는 rubygems-devel 패키지에서 제공합니다.

표 5.4. RubyGems의 매크로

매크로 이름확장 경로사용법

%{gem_dir}

/usr/share/gems

gem 구조의 최상위 디렉터리입니다.

%{gem_instdir}

%{gem_dir}/gems/%{gem_name}-%{version}

gem의 실제 콘텐츠가 있는 디렉터리입니다.

%{gem_libdir}

%{gem_instdir}/lib

gem의 라이브러리 디렉터리입니다.

%{gem_cache}

%{gem_dir}/cache/%{gem_name}-%{version}.gem

캐시된 gem.

%{gem_spec}

%{gem_dir}/specifications/%{gem_name}-%{version}.gemspec

gem 사양 파일입니다.

%{gem_docdir}

%{gem_dir}/doc/%{gem_name}-%{version}

gem의 RDoc 문서입니다.

%{gem_extdir_mri}

%{_libdir}/gems/ruby/%{gem_name}-%{version}

gem 확장을 위한 디렉터리입니다.

5.7.3.3. RubyGems SPEC 파일 예

특정 섹션에 대한 설명과 함께 gem을 빌드하는 SPEC 파일의 예는 다음과 같습니다.

RubyGems SPEC 파일의 예

%prep
%setup -q -n  %{gem_name}-%{version}

# Modify the gemspec if necessary
# Also apply patches to code if necessary
%patch0 -p1

%build
# Create the gem as gem install only works on a gem file
gem build ../%{gem_name}-%{version}.gemspec

# %%gem_install compiles any C extensions and installs the gem into ./%%gem_dir
# by default, so that we can move it into the buildroot in %%install
%gem_install

%install
mkdir -p %{buildroot}%{gem_dir}
cp -a ./%{gem_dir}/* %{buildroot}%{gem_dir}/

# If there were programs installed:
mkdir -p %{buildroot}%{_bindir}
cp -a ./%{_bindir}/* %{buildroot}%{_bindir}

# If there are C extensions, copy them to the extdir.
mkdir -p %{buildroot}%{gem_extdir_mri}
cp -a .%{gem_extdir_mri}/{gem.build_complete,*.so} %{buildroot}%{gem_extdir_mri}/

다음 표에서는 RubyGems SPEC 파일의 특정 항목에 대한 세부 사항을 설명합니다.

표 5.5. RubyGems의 SPEC 지시문 특정

SPEC 지시문RubyGems 세부 정보

%Prep

RPM은 gem 아카이브의 직접 압축을 풀 수 있으므로 gem에서 소스를 추출하기 위해 gem 압축 을 풀 수 있습니다. %setup -n %{gem_name}-%{version} 매크로는 gem의 압축을 풀 수 있는 디렉터리를 제공합니다. 동일한 디렉터리 수준에서 %{gem_name}-%{version} .gemspec 파일이 자동으로 생성됩니다. 이 파일은 나중에 gem을 다시 빌드하거나 .gemspec을 수정하거나 .gemspec을 코드에 패치를 적용하는 데 사용할 수 있습니다.

%build

이 지시문에는 소프트웨어를 머신 코드로 빌드하는 명령 또는 일련의 명령이 포함되어 있습니다. %gem_install 매크로는 gem 아카이브에서만 작동하며 gem은 다음 gem 빌드로 다시 생성됩니다. 그런 다음 %gem_install 에서 생성된 gem 파일은 기본적으로 ./%{gem_dir} 인 임시 디렉터리에 코드를 빌드하고 설치하는 데 사용됩니다. %gem_install 매크로는 한 단계로 코드를 빌드하고 설치합니다. 설치하기 전에 빌드된 소스는 자동으로 생성된 임시 디렉터리에 배치됩니다.

%gem_install 매크로는 설치에 사용되는 gem을 재정의할 수 있는 -n <gem_file>, gem 설치 대상을 재정의할 수 있는 -d <install_dir>; 이 옵션을 사용하는 것은 권장되지 않습니다.

%gem_install 매크로는 %{buildroot} 에 설치하는 데 사용해서는 안 됩니다.

%install

설치는 %{buildroot} 계층 구조로 수행됩니다. 필요한 디렉터리를 생성한 다음 임시 디렉터리에 설치된 디렉터리를 %{buildroot} 계층 구조로 복사할 수 있습니다. 이 gem이 공유 오브젝트를 생성하는 경우 아키텍처별 %{gem_extdir_mri} 경로로 이동합니다.

추가 리소스

5.7.3.4. gem2rpm을 사용하여 RubyGems 패키지를 RPM SPEC 파일로 변환

gem2rpm 유틸리티는 RubyGems 패키지를 RPM SPEC 파일로 변환합니다.

다음 섹션에서는 다음 방법을 설명합니다.

  • gem2rpm 유틸리티 설치
  • 모든 gem2rpm 옵션 표시
  • gem2rpm 을 사용하여 RPM SPEC 파일에 RubyGems 패키지를 포함
  • gem2rpm 템플릿 편집
5.7.3.4.1. gem2rpm 설치

다음 절차에서는 gem2rpm 유틸리티를 설치하는 방법을 설명합니다.

절차

  • RubyGems.org 에서 gem2rpm 을 설치하려면 다음을 실행합니다.
$ gem install gem2rpm
5.7.3.4.2. gem2rpm의 모든 옵션 표시

다음 절차에서는 gem2rpm 유틸리티의 모든 옵션을 표시하는 방법을 설명합니다.

절차

  • gem2rpm 의 모든 옵션을 보려면 다음을 실행합니다.

    gem2rpm --help
5.7.3.4.3. gem2rpm을 사용하여 RPM SPEC 파일에 RubyGems 패키지 포함

다음 절차에서는 gem2rpm 유틸리티를 사용하여 RPM SPEC 파일에 RubyGems 패키지를 다루는 방법을 설명합니다.

절차

  • 최신 버전에서 gem을 다운로드하고 이 gem에 대한 RPM SPEC 파일을 생성합니다.

    $ gem2rpm --fetch <gem_name> > <gem_name>.spec

설명된 프로시저는 gem의 메타데이터에 제공된 정보를 기반으로 RPM SPEC 파일을 생성합니다. 그러나 gem은 라이센스 및 변경 로그와 같은 RPM에서 일반적으로 제공되는 몇 가지 중요한 정보를 놓치고 있습니다. 따라서 생성된 SPEC 파일을 편집해야 합니다.

5.7.3.4.4. gem2rpm 템플릿

gem2rpm 템플릿은 다음 표에 나열된 변수를 포함하는 표준 임베디드 Ruby(ERB) 파일입니다.

표 5.6. gem2rpm 템플릿의 변수

Variable설명

패키지

gem의 Gem::Package 변수.

spec

gem의 Gem::Specification 변수( format.spec과 동일).

config

사양 템플릿 도우미에 사용되는 기본 매크로 또는 규칙을 재정의할 수 있는 Gem2Rpm::Configuration 변수.

runtime_dependencies

Gem2Rpm::RpmDependencyList 변수는 패키지 런타임 종속 항목 목록을 제공합니다.

development_dependencies

Gem2Rpm::RpmDependencyList 변수는 패키지 개발 종속 항목 목록을 제공합니다.

테스트

Gem2Rpm::TestSuite 변수는 실행할 수 있는 테스트 프레임워크 목록을 제공합니다.

파일

Gem2Rpm::RpmFileList 변수는 패키지에서 필터링되지 않은 파일 목록을 제공합니다.

main_files

Gem2Rpm::RpmFileList 변수는 기본 패키지에 적합한 파일 목록을 제공합니다.

doc_files

Gem2Rpm::RpmFileList 변수는 -doc 하위 패키지에 적합한 파일 목록을 제공합니다.

형식

gem의 Gem::Format 변수. 이 변수는 더 이상 사용되지 않습니다.

5.7.3.4.5. 사용 가능한 gem2rpm 템플릿 나열

다음 절차에서는 사용 가능한 모든 gem2rpm 템플릿을 나열하도록 설명합니다.

절차

  • 사용 가능한 모든 템플릿을 보려면 다음을 실행합니다.

    $ gem2rpm --templates
5.7.3.4.6. gem2rpm 템플릿 편집

생성된 SPEC 파일을 편집하는 대신 RPM SPEC 파일이 생성되는 템플릿을 편집할 수 있습니다.

gem2rpm 템플릿을 편집하려면 다음 절차를 사용하십시오.

절차

  1. 기본 템플릿을 저장합니다.

    $ gem2rpm -T > rubygem-<gem_name>.spec.template
  2. 필요에 따라 템플릿을 편집합니다.
  3. 편집된 템플릿을 사용하여 SPEC 파일을 생성합니다.

    $ gem2rpm -t rubygem-<gem_name>.spec.template <gem_name>-<latest_version.gem > <gem_name>-GEM.spec

이제 RPM 빌드에 설명된 대로 편집된 템플릿을 사용하여 RPM 패키지를 빌드할 수 있습니다.