Thứ ba, 05/08/2014 | 00:00 GMT+7

Cách sử dụng FPM để dễ dàng tạo gói ở nhiều định dạng

Các định dạng đóng gói được sử dụng bởi các bản phân phối khác nhau của Linux có thể là một điểm khó khăn cho các nhà phát triển phần mềm muốn phát hành các dự án của họ theo cách dễ dàng tiêu thụ. Debian và Ubuntu dựa trên .deb gói .deb , trong khi Fedora và RedHat đều sử dụng trình cài đặt gói kiểu .rpm . Những thứ này không tương thích và các công cụ cần thiết để tạo ra chúng có thể hơi khó làm việc đối với những người không quen thuộc với tính kỳ dị của từng loại.

Trong khi người bảo trì gói cho các bản phân phối thực hiện công việc nặng nhọc cho các gói có trong repository lưu trữ chính thức, nếu bạn có kế hoạch phát hành phần mềm cho các bản phân phối này trên trang web của riêng mình hoặc cần tạo gói cho tổ chức của bạn , bạn thường sẽ muốn tự cung cấp các gói. Theo truyền thống, điều này liên quan đến việc tìm hiểu hoạt động của ít nhất một vài công cụ cho mỗi họ đóng gói.

Để giảm thiểu các biến chứng của quá trình này, một công cụ có tên là fpm đã được tạo ra. Sử dụng fpm , bạn có thể dễ dàng tạo cả file .deb.rpm mà không cần phải biết bất kỳ lệnh nào của các công cụ đóng gói mà nó sử dụng. Trong hướng dẫn này, ta sẽ thảo luận về cách sử dụng fpm để tạo các gói có định dạng khác nhau bằng server Ubuntu 14.04.

Cài đặt FPM

Phương thức phân phối chính của công cụ fpm là như một viên ngọc Ruby. Ta có thể chuẩn bị hệ thống của bạn để cài đặt fpm bằng cách cài đặt cả gói phát triển Ruby và các công cụ xây dựng phần mềm cần thiết để biên dịch phần mềm bổ sung.

Trước tiên, hãy cập nhật cache ẩn gói local của bạn và sau đó tiến hành cài đặt yêu cầu :

sudo apt-get update sudo apt-get install ruby-dev build-essential 

Sau khi các gói trên được cài đặt, bạn có thể lấy chính gói fpm bằng lệnh :

sudo gem install fpm 

Điều này sẽ cài đặt fpm ở phạm vi hệ thống và cung cấp cho mọi user trên hệ thống. Sự khôn ngoan về đóng gói thông thường khuyên bạn nên tạo các gói như một user bình thường, không phải root. Điều này an toàn hơn trong trường hợp lỗi đóng gói có thể ảnh hưởng đến hệ thống của bạn.

Đến đây bạn sẽ có file thực thi fpm có sẵn trên hệ thống của bạn . Bạn có thể xác minh điều này bằng cách xem thông tin trợ giúp phong phú của công cụ:

fpm --help 
Intro:    This is fpm version 1.2.0    If you think something is wrong, it's probably a bug! :)   Please file these here: https://github.com/jordansissel/fpm/issues    You can find support on irc (#fpm on freenode irc) or via email with   fpm-users@googlegroups.com  Usage:     fpm [OPTIONS] [ARGS] ... . . . 

Đến đây bạn có thể bắt đầu xây dựng các gói.

Làm quen với chức năng FPM cơ bản

Công cụ fpm khá tốt trong việc cho bạn biết nó cần những gì để hoàn thành một gói xây dựng. Để có ý tưởng về các yêu cầu cơ bản nhất, bạn có thể gọi lệnh không có đối số:

fpm 
Missing required -s flag. What package source did you want? {:level=>:warn} Missing required -t flag. What package output did you want? {:level=>:warn} No parameters given. You need to pass additional command arguments so that I know what you want to build packages from. For example, for '-s dir' you would pass a list of files and directories. For '-s gem' you would pass a one or more gems to package from. As a full example, this will make an rpm of the 'json' rubygem: `fpm -s gem -t rpm json` {:level=>:warn} Fix the above problems, and you'll be rolling packages in no time! {:level=>:fatal} 

Đầu ra này cho ta biết những điều cơ bản về những gì ta cần cung cấp để tạo một gói. Một cuộc gọi thông thường sẽ trông như thế này ở dạng cơ bản:

fpm -s source_type -t target_type source_name_or_location 

Nguồn có thể là bất kỳ trong số nhiều loại. Kiểu nguồn cũng sẽ chỉ định cách mà tên nguồn hoặc vị trí được chuyển đến lệnh. Ta sẽ thảo luận về các định dạng đầu vào và kết quả có thể có trong phần tiếp theo.

Một số định dạng sẽ yêu cầu các tiện ích trợ giúp bổ sung được liên kết với loại gói riêng lẻ được cài đặt để chuyển đổi. Vì ta đã cài đặt các yếu tố cần thiết của Ruby để fpm động và vì ta đang sử dụng hệ thống Ubuntu, nên có thể chuyển đổi file Ruby gem sang .deb .

Hãy chọn một viên ngọc thường được sử dụng, chẳng hạn như bundler . Ta có thể tạo một .deb từ gói bundler nằm trên rubygems.org bằng lệnh :

fpm -s gem -t deb bundler 
Created package {:path=>"rubygem-bundler_1.6.5_all.deb"} 

Một file có tên rubygem-bundler_1.6.5_all.deb đã được tạo trong folder local (số version của bạn có thể khác). Bây giờ ta có thể cài đặt cái này như ta làm với bất kỳ .deb nào khác:

sudo dpkg -i rubygem-bundler_1.6.5_all.deb 

Khi bạn kiểm tra danh sách các gem đã được cài đặt, bạn sẽ thấy rằng ta hiện có sẵn gói gộp:

gem list 
*** LOCAL GEMS ***  arr-pm (0.0.9) backports (3.6.0) bundler (1.6.5) cabin (0.6.1) childprocess (0.5.3) clamp (0.6.3) ffi (1.9.3) fpm (1.2.0) json (1.8.1) 

Ta có thể dễ dàng sử dụng định dạng nguồn hoặc kết quả khác, nhưng những định dạng này yêu cầu một số công cụ bổ sung trên hệ thống của ta để chuyển đổi định dạng. Ta sẽ thảo luận điều này sau.

Định dạng nguồn và mục tiêu

Công cụ fpm có thể hoạt động với khá nhiều định dạng nguồn và đích khác nhau. Mỗi cái đều có những yêu cầu và tính năng riêng.

Trong trường hợp có một index gói tương đối chuẩn trực tuyến cho một định dạng (chẳng hạn như rubygems.org cho các file Ruby gem), fpm có thể tự động tìm kiếm index và download các file cần thiết. Trước tiên, nó sẽ tìm kiếm kết quả phù hợp trong folder hiện tại, sau đó tìm kiếm trong index nếu không tìm thấy kết quả phù hợp local .

Các loại nguồn sau hiện được hỗ trợ:

Loại nguồn Mô tả nguồn Cách chuyển Tên nguồn hoặc Vị trí Các gói bổ sung cần thiết
dir Thư mục hoặc file Chuyển (các) đường dẫn tuyệt đối hoặc tương đối của các file dự án trên hệ thống file local . (không ai)
nhựa đường Một gói nguồn tarball Chuyển đường dẫn đến vị trí rball (nén hoặc không nén) trên hệ thống file local . (không ai)
đá quý Một viên ngọc Ruby Chuyển tên của viên ngọc Ruby có thể tìm thấy trên www.rubygems.org . Nó sẽ được tự động download để tạo gói. ruby , rubygems-integration
con trăn Một gói Python Chuyển tên của một gói Python như bạn sẽ chuyển nó vào easy_install . Tên được tìm kiếm trong Index gói Python và tự động download để tạo gói. python-setuptools
Một phần mở rộng PHP Chuyển tên của một phần mở rộng PHP hoặc ứng dụng được tìm thấy trên Pear.php.net. Các file thích hợp sẽ được tự động download khi tạo gói. php-pear
cpan Một module Perl Chuyển tên của module Perl như được tìm thấy tại cpan.org. Các file sẽ được tự động download và được sử dụng để xây dựng gói. cpanminus
zip Cấu trúc folder nén Chuyển vị trí trên hệ thống file local của file zip chứa gói. zip
npm Một module Node.js Chuyển tên của module Node như được chỉ định trên npmjs.org. Gói sẽ được tự động download và được sử dụng để tạo gói kết quả . npm
osxpkg Một gói OS X Chuyển vị trí trên hệ thống file local của gói OS X (điều này sẽ chỉ hoạt động trên hệ thống OS X có pkgbuild trong đường dẫn của chúng). pkgbuild (chỉ có sẵn cho hệ thống OS X)
trống (Không có nguồn) Được sử dụng để tạo một gói mà không có bất kỳ gói thực tế nào. Điều này được sử dụng thường xuyên nhất cho các gói meta chỉ chứa các phần phụ thuộc. (không ai)
deb Một .deb Chuyển vị trí của file .deb trên hệ thống file local . (không có trên hệ thống dựa trên Debian)
vòng / phút Một gói .rpm Chuyển vị trí của file .rpm trên hệ thống file local . rpm

Ngoài ra còn có một số tùy chọn cho các định dạng đóng gói mục tiêu mà bạn muốn tạo. Bảng dưới đây mô tả một số tùy chọn khác nhau:

Loại kết quả Mô tả kết quả Các gói bổ sung cần thiết
deb Một gói kiểu Debian có thể được cài đặt trên hệ thống Debian hoặc Ubuntu. (không có trên hệ thống dựa trên Debian)
vòng / phút Một gói kiểu RedHat có thể được cài đặt trên hệ thống CentOS, Fedora hoặc RedHat. rpm
zip Tệp zip chứa folder và cấu trúc file của gói đầu vào. zip
nhựa đường Một tarball (nén hoặc không nén) cấu trúc folder của gói đầu vào. (không ai)
dir Một folder để extract gói đã nhập. (không ai)
sh Tệp .sh tự extract .Đây là một tập lệnh shell với một file tar được nén sẽ được extract khi chạy. (không ai)
osxpkg Tệp gói dành cho OS X. Bạn phải làm việc trên cài đặt OS X có cài đặt pkgbuild để tạo các gói này. pkgbuild (chỉ có sẵn cho hệ thống OS X)
solaris Một gói phù hợp để cài đặt trên hệ thống Solaris. Bạn phải có pkgprotopkgmk cài đặt, mà chỉ có sẵn trên máy Solaris. pkgproto , pkgmk (chỉ có trên hệ thống Solaris)
pkgin Một gói phù hợp để cài đặt trên các hệ thống BSD. Bạn phải cài đặt gói pkg_create gói này chỉ khả dụng trên hệ thống BSD. pkg_create (chỉ khả dụng trên hệ thống BSD)
puppet Một module rối được dùng để cài đặt trên các hệ thống khác nhau. ( Lưu ý: Định dạng này không hoạt động chính xác với version fpm hiện tại ). (không thể kiểm tra ở trạng thái không hoạt động)

Như bạn thấy , một số định dạng cho cả thông số kỹ thuật nguồn và đích yêu cầu bạn phải sử dụng một hệ điều hành cụ thể. Vì ta đang trình diễn công cụ này trên Ubuntu 14.04, định dạng nguồn osxpkg và các định dạng kết quả osxpkg , solarispkgin sẽ không khả dụng.

Thay đổi hành vi FPM với các tùy chọn

Sử dụng thông tin từ các bảng trong phần trên, bạn có thể tạo một số gói cơ bản bằng cách sử dụng cài đặt mặc định fpm . Tuy nhiên, hầu hết thời gian, bạn cần cung cấp một số thông tin bổ sung để định hình gói kết quả.

Các tùy chọn phải được chỉ định trước đối số nguồn chỉ định vị trí hoặc tên của gói ban đầu.

nhiều tùy chọn khác nhau cho fpm . Ta sẽ chỉ đề cập đến một vài trong số những cái phổ biến hơn bên dưới. Để có danh sách đầy đủ, hãy xem lệnh fpm --help .

Một số tùy chọn phổ biến mà bạn có thể cần sử dụng là:

  • -C : Chỉ định một folder để thay đổi trước khi tìm kiếm file .
  • –Prefix : Đường dẫn folder chỉ định nơi các file trong gói kết quả sẽ được cài đặt.
  • -p : Tên gói và đường dẫn cho gói của bạn. Điều này có thể overrides tên file của file gói kết quả.
  • -n : Tên bạn muốn sử dụng cho gói. Đây là tên được hiển thị trong các công cụ đóng gói cho nền tảng của bạn.
  • -v : Số version bạn muốn sử dụng cho gói của bạn .
  • –Iteration : Thông tin phát hành cho gói. Tên của phân phối cho số này khác nhau, nhưng nói chung là một cách để theo dõi version gói, trái ngược với version của ứng dụng.
  • –License : Tên cấp phép cho gói. Điều này sẽ bao gồm loại giấy phép trong metadata cho gói, nhưng sẽ không bao gồm file giấy phép được liên kết trong chính gói.
  • –Category : Danh mục mà gói này thuộc về. Điều này được dùng để tổ chức gói trong repo.
  • -d : Điều này được dùng nhiều lần để chỉ định các phụ thuộc của gói.
  • –Provides : Điều này được dùng để chỉ định chức năng hệ thống mà gói này cung cấp. Điều này thường được sử dụng khi có nhiều lựa chọn để đáp ứng một yêu cầu.
  • –Conflicts : Được sử dụng để chỉ định các gói không được cài đặt.
  • –Replaces : Được sử dụng để chỉ định các gói cần được gỡ bỏ khi gói này được cài đặt.
  • –Config-files : Được sử dụng để đánh dấu các file trong gói dưới dạng file cấu hình. Nói chung, người quản lý gói sẽ giữ nguyên những thứ này khi gói được gỡ bỏ.
  • –Directories : Đánh dấu một folder là thuộc sở hữu của gói.
  • -a : Chỉ định kiến trúc cho gói.
  • -m : Ghi đè trường bảo trì gói. Theo mặc định, nó sẽ sử dụng username@host cho trường này.
  • -e : Xem lại và chỉnh sửa file thông số kỹ thuật theo cách thủ công trước khi xây dựng gói. Điều này được dùng để điều chỉnh bất kỳ giá trị mặc định nào đã được sử dụng cho các thông số kỹ thuật của gói.
  • –Description : Đặt mô tả cho gói.
  • – After-install , –before-install , – after-remove , –before-remove : Các file script sẽ được chạy vào thời điểm thích hợp.

Ngoài ra còn có một số tùy chọn dành riêng cho các định dạng đóng gói mà bạn chọn. Để có danh sách đầy đủ, hãy kiểm tra trợ giúp.

Tùy chỉnh các gói

Nếu bạn muốn tùy chỉnh thêm chi tiết và không muốn dịch trực tiếp một định dạng sang định dạng kết quả của bạn , bạn có thể cần áp dụng một quy trình làm việc khác.

Quá trình này sẽ phản ánh bao bì truyền thống chặt chẽ hơn một chút, nhưng cũng sẽ cung cấp các lợi ích của việc có thể nhanh chóng tạo ra nhiều định dạng kết quả . Ta có thể minh họa quy trình làm việc chung bên dưới, giả sử rằng ứng dụng được đề cập sử dụng quy trình biên dịch và cài đặt ./configure , make , make install tiêu chuẩn.

Để bắt đầu, hãy cài đặt tất cả các phần phụ thuộc mà bạn cần cho gói. Sau đó, lấy gói nguồn cho dự án từ trang web của nó và đặt nó vào một folder đang hoạt động:

mkdir ~/build cd ~/build wget http://example.com/project.tar.gz 

Bây giờ, bạn có thể extract file và thay đổi vào folder kết quả:

tar xzvf project.tar.gz cd project 

Trong folder này, bạn sẽ có các file nguồn cho ứng dụng bạn muốn đóng gói. Đến đây bạn có cơ hội thực hiện một số chỉnh sửa đối với file và cấu hình một số tùy chọn.

Cách thông thường để chỉ định các tùy chọn trong quá trình xây dựng là sử dụng tập lệnh ./configure kèm. Kiểm tra tài liệu của dự án để tìm ra các tùy chọn biên dịch có sẵn. Bạn có thể chỉ định chúng bằng cách gọi tập lệnh configure với các tùy chọn của bạn:

./configure --compilation_option=value --another_option=value --optional_flag ... 

Điều này sẽ tạo hoặc sửa đổi các file được đọc bởi lệnh make khi gói đang được xây dựng. Bây giờ ta có thể tạo các file cài đặt thực tế bằng lệnh :

make 

Thay vì cài đặt các file này mà ta đã cấu hình trên hệ thống của bạn , ta sẽ cài đặt chúng vào một folder giả, trống mà ta có thể xây dựng một gói thực sự. Tạo một folder để cài đặt gói để:

mkdir -p /tmp/project 

Ta có thể gắn nhãn folder mới này là vị trí cài đặt root bằng cách chuyển tùy chọn DESTDIR để make install :

make DESTDIR=/tmp/project install 

Gói của ta hiện đã được cài đặt sạch sẽ vào một folder khung trống. Nó đã tạo ra tất cả cấu trúc folder cần thiết, nhưng không có gì liên quan đến gói trong folder đó.

Đây là cơ hội thứ hai để bạn tùy chỉnh cài đặt của bạn . Nếu bạn muốn bao gồm các file bổ sung trong cấu trúc phân cấp để cài đặt, bạn có thể thêm chúng vào vị trí thích hợp trong cấu trúc này ngay bây giờ.

Khi đã sẵn sàng , bạn có thể sử dụng fpm để tạo file gói thích hợp. Ví dụ: ta có thể chuyển một số thông tin về version và mô tả về gói trong lệnh fpm của ta . Ta cũng có thể liệt kê thông tin phụ thuộc hoặc cung cấp các chi tiết bổ sung sẽ ảnh hưởng đến việc tạo các file meta đóng gói.

Ta có thể sử dụng cấu trúc folder để xây dựng nhiều định dạng đóng gói. Ví dụ: sau đó ta có thể tạo một .deb bằng lệnh :

fpm -s dir -t deb -C /tmp/project --name project_name --version 1.0.0 --iteration 1 --depends debian_dependency1 --description "A sample package" . 

Thao tác này sẽ tạo một gói có tên là project-name_1.0.0-1_amd64.deb trong folder hiện tại.

Sau đó, bạn có thể sửa đổi một số tùy chọn để tạo gói .rpm (giả sử bạn đã cài đặt gói rpm từ repository ):

fpm -s dir -t rpm -C /tmp/project --name project_name --version 1.0.0 --iteration 1 --depends  redhat_dependency1 --description "A sample package" . 

Thao tác này sẽ tạo một gói có tên là project_name-1.0.0-1.x86_64.rpm trong folder hiện tại của bạn.

Như bạn thấy , khá dễ dàng để tạo các gói tùy chỉnh với fpm . Hầu hết các nhiệm vụ khó vẫn do cụ đảm nhận.

Kết luận

Sử dụng fpm có thể giúp cuộc sống của bạn dễ dàng hơn khi cố gắng tạo các gói để sử dụng trên cơ sở hạ tầng của bạn hoặc khi phân phối các gói có thể download công khai của dự án của bạn. Mặc dù nó có thể không phải là giải pháp lý tưởng để đóng gói cho repository của một nhà phân phối thực tế vì những lo ngại về policy , nhưng lợi thế của nó rất hấp dẫn trong nhiều trường hợp.


Tags:

Các tin liên quan