我已经按照this准备了一个构建框说明,我四处搜索并做了一个 hello world rpm 构建,但仍然不确定打包一堆 js 文件(nodejs 应用程序)的最佳方法是什么。我愿意:
- 将文件部署到一个位置
- 运行 # npm 安装
- 运行命令以启动 Node 监听器/守护进程。
我已经完成了一个非常简单的规范文件,如下所示:
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 如何开展业务。
那么在这种情况下我需要使用哪个宏? 我需要在 %files 下创建文件列表吗? 在运行 rpmbuild 之前我需要 gzip 文件吗?或者我可以在 rpmbuild 期间对它们进行 gzip 压缩吗?
感谢任何帮助。
最佳答案
可以找到为 Fedora EPEL 存储库打包 nodejs 应用程序的指南 here .在打包您自己的 nodejs 应用程序时,它们是很好的引用。
您没有提及您使用的是什么版本或哪个发行版,但我假设它是最近的发行版,因此您要启动的服务将在 systemd 下运行。可以找到 Fedora systemd 打包指南 here .
我还假设您正在使用 github 来管理代码,并且它是一个纯 JS 应用程序。
对于没有依赖关系或仅依赖于已打包在 EPEL 中的 nodejs 模块的 nodejs 模块/应用程序,以下 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
此规范文件还将处理具有已打包为 EPEL 一部分的依赖项的 nodejs 模块。 RPM 的自动要求/提供功能使用模块中的 package.json 文件在最终的 RPM 包中创建必要的要求依赖项。
应使用以下命令将源 zip 从 github 下载到 SOURCES 目录:
wget -O SOURCES/myapp-0.1.zip https://github.com/myuser/myapp/archive/v0.1.zip
RPM 使用以下命令构建:
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
在行的%install
#
# 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 中列出的所有依赖项都将捆绑到您的应用中,使其成为一个独立的应用。
上述命令中npm用法说明
- npm install 在 package/application 目录中执行,并处理该目录中包含的包。
- -g 将包作为全局包安装到当前工作目录
- -q 仅打印警告和错误
- --production 不要复制 devDependencies
- --prefix= 安装在前缀目录
作用是将本地目录下的nodejs app复制到${RPM_BUILD_ROOT}%{_prefix}准备打包。
关于linux - 需要一些帮助来为 nodejs 应用程序创建 rpm 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28842740/