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
và .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 |
Lê | 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ó pkgproto và pkgmk 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
, solaris
và pkgin
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.
Có 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.
Các tin liên quan