【发布时间】:2021-11-22 21:36:19
【问题描述】:
我构建了我的第一个 rpm 包。这是将应用程序部署到我们的分布式 SuSE 服务器的规定方式。 该应用程序是使用 NodeJs 和 Typescript 构建的。
我们有一个构建步骤,将 Typescript 转录为 Javascript 到 dist 文件夹中。 NPM 在 node_modules 文件夹中提供依赖项。然后是一些.env 配置文件,一个名为myApplication 的启动应用程序的bash 脚本和一个名为myDaemon 的init.d 脚本。这些都被打包到一个 tar.gz 文件中。结构如下:
myApplication.tar.gz
|
|--dist
| |
| |-index.js
| |-...
|
|--node_modules
| |
| |-dependency_a
| |-dependency_b
| |-...
|
|--.env
|--.env.production
|--.env.development
|--.env.sample
|--myApplication
|--myDaemon
rpmbuild 解压缩 tar.gz 文件,在构建根目录中创建所需的文件夹并将文件复制到正确的文件夹中。 dist 和 node_modules 转到 /opt 中的文件夹。配置文件到文件夹/etc/,守护进程到/etc/init.d,启动应用程序的可执行bash脚本到/usr/bin。自述文件被视为文档,日志文件被标记为幽灵。
这是规范文件:
%define debug_package %{nil}
# Use other payload algorithm to fix the following error on SuSE: Failed dependencies: rpmlib(FileDigests) <= 4.6.0-1 is needed
%define _binary_filedigest_algorithm 1
# 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 myApplication
Summary: The %{modname} is a nodeJs project
Name: %{modname}
Group: Applications/Server
Version: 0.1
Release: 1
License: None
URL: https://private.git/myApplication
Source0: myApplication.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: x86_64
ExclusiveArch: x86_64
BuildRequires: npm
Requires: nodejs10
AutoReq: no
AutoProv: no
%description
%{Summary}
#Unpack the tar.gz file
%prep
%setup -q -n myApplication
%build
#Code is already build
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/etc/myApplication
%{__cp} -r $RPM_BUILD_DIR/myApplication/.env* $RPM_BUILD_ROOT/etc/myApplication
mkdir -p $RPM_BUILD_ROOT/opt/myApplication/dist
%{__cp} -r $RPM_BUILD_DIR/myApplication/dist $RPM_BUILD_ROOT/opt/myApplication/
mkdir -p $RPM_BUILD_ROOT/opt/myApplication/node_modules
%{__cp} -r $RPM_BUILD_DIR/myApplication/node_modules $RPM_BUILD_ROOT/opt/myApplication/
mkdir -p $RPM_BUILD_ROOT/usr/bin
%{__cp} -r $RPM_BUILD_DIR/myApplication/myApplication $RPM_BUILD_ROOT/usr/bin/myApplication
mkdir -p $RPM_BUILD_ROOT/etc/init.d/
%{__cp} -r $RPM_BUILD_DIR/myApplication/myDaemon $RPM_BUILD_ROOT/etc/init.d/myDaemon
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(0755, root, root)
%doc README.md
%dir /etc/myApplication
%config /etc/myApplication/.env
%config /etc/myApplication/.env.production
%config /etc/myApplication/.env.development
/etc/myApplication/.env.sample
/opt/myApplication
/usr/bin/myApplication
/etc/init.d/myDaemon
%ghost /var/log/myApplication.log
%ghost /var/log/myDaemon.log
%changelog
* Wed Sep 29 2021 seism0saurus
- Initial spec file for myApplication
使用 -vv 构建的 rpm 运行良好,并列出了来自 node_modules 的所有依赖项。我还可以使用 zip 实用程序打开 rpm,并可以在 /opt/myApplication/node_modules 文件夹中查看所有需要的依赖项。
但是当我运行zypper install myApplication.rpm 时,只安装了node_modules 文件夹中的一些依赖项。例如,dependency_b 缺失但已安装dependency_a。我可以通过rpm -V -v --nodeps -p myApplication.rpm 进行检查。文件夹被标记为丢失。这是输出的一部分:
.......T /opt/myApplication/node_modules/triple-beam/test.js
missing /opt/myApplication/node_modules/url-parse
missing /opt/myApplication/node_modules/url-parse/LICENSE
missing /opt/myApplication/node_modules/url-parse/README.md
missing /opt/myApplication/node_modules/url-parse/dist
missing /opt/myApplication/node_modules/url-parse/dist/url-parse.js
missing /opt/myApplication/node_modules/url-parse/dist/url-parse.min.js
missing /opt/myApplication/node_modules/url-parse/dist/url-parse.min.js.map
missing /opt/myApplication/node_modules/url-parse/index.js
missing /opt/myApplication/node_modules/url-parse/package.json
........ /opt/myApplication/node_modules/util-deprecate
我通常使用 Debian/GNU Linux 而不是 SuSE,所以我对 rpm 没有任何经验。 有人可以解释一下,为什么没有安装文件夹和文件,尽管 rpm 知道应该安装它们并将它们显示为丢失? 我该如何解决?我的规范或打包 NodeJs 应用程序的方法有问题吗?
--- 编辑 ---
rpm 包在我的 Leap 15 容器 (rpm 4.14.3) 中运行良好。问题仅出现在 SLES 11 安装 (rpm 4.4.2.3) 上。 所以问题似乎与旧版本的rpm有关。
--- 编辑 2 ---
我通过配置压缩算法来调整规范:
%define _source_payload w0.gzdio
%define _binary_payload w0.gzdio
现在我可以使用 rpm 正确安装软件包,但 zypper 仍然存在同样的问题。 对此有什么想法吗?
亲切的问候,
seism0saurus
【问题讨论】:
-
我建议尝试安装带有越来越多“详细”标志的 RPM 包。也许它正在默默地失败,这可能会通过足够的调试输出来显示原因。
-
我使用“ZYPP_LOGFILE=log zypper -vv install myApplication.rpm”记录任何错误,但找不到任何错误。如果我使用日志中的 rpm 命令,它也可以工作“ rpm --root / --dbpath /var/lib/rpm -U --percent --force --nodeps --myApplication.rpm”
-
这似乎是一个缓存问题。在我为我的包 zypper 设置了不同的版本后,它正确安装了。
标签: node.js linux rpm rpmbuild