为什么我的rpm安装后文件丢失了?

问题描述 投票:0回答:2

我构建了我的第一个 rpm 包。这是将应用程序部署到我们的分布式 SuSE 服务器的规定方法。 该应用程序是使用 NodeJs 和 Typescript 构建的。

我们有一个构建步骤,将 Typescript 转录为 Javascript 到

dist
文件夹中。 NPM 在
node_modules
文件夹中提供依赖项。然后是一些
.env
配置文件、一个用于启动应用程序的 bash 脚本(称为
myApplication
)和一个名为
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
中。自述文件被视为文档,日志文件被标记为 Ghost。 这是规格文件:

%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
文件夹中查看所有需要的依赖项。

但是当我运行

node_modules
时,仅安装了
zypper install myApplication.rpm
文件夹中的一些依赖项。例如,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 仍然存在同样的问题。 对此有什么想法吗?

亲切的问候,

地震0龙

node.js linux rpm rpmbuild
2个回答
0
投票

最终的解决方案是在规范文件中使用不同的压缩算法,并为包提供新的版本号,以便 zypper 不会使用缓存中的旧版本。

%define _source_payload w0.gzdio
%define _binary_payload w0.gzdio

0
投票

我遇到了一个隐约相似的问题,OP 在他最初的问题下关于“这似乎是一个缓存问题”的评论促使我清理目标虚拟机上的 yum 缓存,这解决了我的问题。我构建了一个包含几个自定义防火墙服务定义文件的 RPM,这些文件将被放置到 /etc/firewalld/services/ 目录中。在此构建中,我只是将一个新的 XML 文件添加到 RPM 中并重新构建。我尝试过“yum update”,还尝试完全删除原来的并安装新的,但只添加了原来的防火墙服务模板。我的规范文件似乎是正确的,.rpm 文件似乎也包含我的新文件,但它从未显示出来。在“yum clean 缓存”之后,我的新 XML 文件现在已成功添加到正确的位置。希望这个额外的答案能够鼓励处于类似情况的人尝试清理缓存。

© www.soinside.com 2019 - 2024. All rights reserved.