【问题标题】:Why are files missing after installation of my rpm?为什么我的 rpm 安装后文件丢失了?
【发布时间】: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 文件,在构建根目录中创建所需的文件夹并将文件复制到正确的文件夹中。 distnode_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


【解决方案1】:

最终的解决方案是在 spec 文件中使用不同的压缩算法,并给包一个新的版本号,这样 zypper 就不会使用缓存中的旧版本。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多