2015-03-03 5 views
3

Я подготовил сборку, следующую за this инструкциями, я искал и сделал приветственный сборник rpm, но все еще не уверен, что лучший способ пойти об упаковке кучи js-файлов (приложение nodejs). Я хотел бы:нужно немного помочь создать пакет rpm для приложения nodejs

  1. развернуть файлы в папку
  2. запустить # НПМ установить
  3. запустить команду для запуска узла слушателя/демона.

Я сделал очень простой файл спецификации, который выглядит следующим образом:

Name:   nodejsapp 
Version:  1.0 
Release:  0 
Summary:  API for a Platform 

Group:   Group 
License:  License 
URL:   somewebsite 
Distribution: Linux CentOS 
Source0:  %{name}-%{version}.tar.gz 

%description 
CDR Platform is awesome product. 


%prep 

%install 
install -m 755 -d $RPM_BUILD_ROOT/opt/cdr/api 

%clean 
rm -rf $RPM_BUILD_ROOT 


%files 
%defattr(-,root,root,-) 

выше строит, но ничего не происходит, когда я устанавливаю! Я не уверен, что полностью понимаю, как работает rpmbuild.

Итак, в этом случае, какой макрос мне нужно использовать? Нужно ли создавать список файлов в% файлов? Нужно ли мне gzip-файлы перед запуском rpmbuild? или я могу gzip их во время rpmbuild?

Любая помощь приветствуется.

+0

Немного старый, но по-прежнему в основном точный http://www.rpm.org/max-rpm/s1-rpm-build-creating-spec-file.html. –

+1

Вы не должны запускать какие-либо службы rpm. Он может настроить их для запуска любым механизмом, который должен начать его продвижение, но он не должен, как правило, запускать сервис самостоятельно. –

+0

@ EtanReisner спасибо, да, я тоже прочитал этот документ, будучи новым для этого, я не уверен, с чего начать? так как я не компилирую код, мне нужно% build% install .. и т. д., связанные со строительным кодом? – nolimit

ответ

3

Рекомендации по упаковке приложений nodejs для репозитория Fedora EPEL можно найти here. Это хорошая рекомендация при упаковке ваших собственных приложений nodejs.

Вы не упомянули, какую версию или какой дистрибутив вы используете, но я собираюсь предположить, что это недавнее распространение, поэтому служба, которую вы хотите запустить, будет запущена под systemd. Руководства по упаковке Fedora systemd можно найти here.

Я также предполагаю, что вы используете github для управления кодом, и это чистое приложение JS.

Для модуля/приложения nodejs, который не имеет зависимостей или имеет только зависимости от модулей nodejs, уже упакованных в EPEL, будет работать следующий файл SPEC (сохраненный как SPECS/nodejs-myapp.spec).

%define debug_package %{nil} 
# 
# automatically generate requires and provides from package.json 
# 
%{?nodejs_find_provides_and_requires} 

# 
# filter out any false provides created due to dependencies with native components 
# 
%{?nodejs_default_filter} 

# 
# name of zip file containing source without .zip extension 
# 
%define modname myapp 

Summary: A nodejs app with a systemd daemon 
Name: nodejs-%{modname} 
Group: Applications/Tools 
Version: 0.1 
Release: 1 
License: Unlicense 
URL:  https://github.com/myuser/myapp 
Source0: %{modname}-%{version}.zip 
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) 
BuildArch: noarch 
ExclusiveArch: %{nodejs_arches} noarch 
BuildRequires: nodejs-packaging 
BuildRequires: systemd 

%description 
A nodejs app that installs as a systemd service 

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

%build 

%{__rm} -f .gitignore 
# 
# Fedora guidlines do not allow bundled modules 
# use nodejs_symlink_deps in the install section to generate 
# links based on package.json contents 
# 
%{__rm} -rf node_modules 

%install 
rm -rf $RPM_BUILD_ROOT 

# 
# copy in the module source 
# 
%{__install} -d $RPM_BUILD_ROOT%{nodejs_sitelib} 
%{__cp} -r $RPM_BUILD_DIR/%{modname}-%{version} $RPM_BUILD_ROOT%{nodejs_sitelib}/%{modname} 
# 
# link the daemon binaries into sbindir 
# 
%{__install} -d $RPM_BUILD_ROOT%{_sbindir} 
%{__ln_s} %{nodejs_sitelib}/%{modname}/bin/myappd $RPM_BUILD_ROOT%{_sbindir}/myappd 

# 
# link in any dependent nodejs modules referenced in package.json 
# 
%nodejs_symlink_deps 

# 
# documents will be handled by %doc, so remove them from buildroot 
# 
%{__rm} -rf $RPM_BUILD_ROOT%{nodejs_sitelib}/%{modname}{CHANGELOG.md,LICENSE.md,README.md,docs} 

# 
# Create a systemd unit file 
# 
cat <<__EOF> $RPM_BUILD_ROOT%{_unitdir}/myappd.service 
[Unit] 
Description=MyApp provides the best API 
Documentation=man:myapp.service(8) 

[Service] 
Type=simple 
ExecStart=/usr/sbin/myappd 

[Install] 
WantedBy=multi-user.target 
__EOF 

%clean 
rm -rf $RPM_BUILD_ROOT 

%files 
%defattr(-,root,root) 
%doc CHANGELOG.md LICENSE.md README.md docs 
%{nodejs_sitelib}/%{modname} 
%{_sbindir}/myappd 
%{_unitdir}/myappd.service 

%changelog 
* Sun Mar 22 2015 BitByteDog 
- Initial spec file for myapp 

Этот файл спецификация будет также справляться с nodejs модулей, которые имеют зависимости, которые уже упакованы в рамках Epel. Авто требует/предоставляет функцию RPM, использует файл package.json в модуле для создания необходимых требуемых зависимостей в последнем пакете RPM.

Источник молнии должен быть загружен с GitHub в каталог ИСТОЧНИКОВ с помощью команды, такие как:

wget -O SOURCES/myapp-0.1.zip https://github.com/myuser/myapp/archive/v0.1.zip 

Обороты построен с помощью команды:

rpmbuild -ba SPECS/nodejs-myapp.spec 

Systemd блок созданный файл является очень просто, прочитайте предоставленную ссылку и соответствующую документацию systemd, чтобы настроить ваши требования. Вам необходимо будет включить и запустить сервис со следующими командами:

systemctl enable myappd.service 
systemctl start myappd.service 

После этого он автоматически начнет работу.

Если вы хотите включить в состав JS-приложения вложенные модули, это можно сделать с помощью npm. Сначала добавьте теги:

BuildRequires: npm 
AutoReq: no 
AutoProv: no 

Для подавления авто требуется/обеспечивает генерацию. Затем снимите линию

%{__rm} -rf node_modules 

из секции% build. Также измените строку

%nodejs_symlink_deps 

в% установке для линий

# 
# npm will bundle in all dependent modules from the npm registry 
# (bundling is OK for private packages but not for EPEL packages) 
# 
npm -g -q --production --prefix="${RPM_BUILD_ROOT}%{_prefix}" install 

Всех модулей в комплекте в приложении и вся зависимость, перечисленная в package.json будут сгруппированной в приложение, что делает его автономным приложение.

Объяснения НОГО использования в команде выше

  • НОЙ установка выполняются в пакете/каталоге приложений и работает на упаковке, содержащейся в этом каталоге.
  • -g установить пакет в текущем рабочем каталоге в качестве глобального пакета предупреждения
  • -q печати и ошибки только
  • --production не копировать devDependencies
  • - prefix = install in prefix directory

Эффект заключается в том, чтобы скопировать приложение nodejs в локальный каталог $ {RPM_BUILD_ROOT}% {_ prefix} готов к упаковке.

+0

Это, конечно, ново для меня, я побежал много поисков, которых я так и не нашел! Я начну читать об этом! Спасибо @BitByteDog – nolimit

+0

есть ли требование установить приложение nodejs в каталоге user/bin? или это просто лучшая практика? Я устанавливаю его в/opt/myapp – nolimit

+1

/opt/myapp - это прекрасное (и правильное) место для размещения nodejs. Причина в том, что есть пакет EPEL packagejes, который устанавливается в/usr. Установка ваших nodejs поверх или вместо пакета EPEL может привести к конфликтам или непреднамеренным побочным эффектам, поскольку все установленные приложения EPEL nodejs теперь будут использовать вашу версию узла. – BitByteDog

Смежные вопросы