我需要我的 Debian 规则文件来简单地将文件复制到它的目标

Posted

技术标签:

【中文标题】我需要我的 Debian 规则文件来简单地将文件复制到它的目标【英文标题】:I need my Debian rules file to simply copy files to it's target 【发布时间】:2011-03-13 23:03:55 【问题描述】:

我有一个大型项目,其中有以下文件:

一些第 3 方预编译的二进制文件 我们自己的内部二进制文件 Ruby 脚本集合 一个相当大的 Ruby on Rails 项目

该产品将安装在我的雇主已经选择的设备硬件上,使用 Ubuntu Linux (Lucid) 作为目标操作系统,我们的目标是将存档作为 Debian 软件包分发以简化安装和升级。此外,我们有许多 ERB 模板,我们需要根据每个客户“填写”适当的值,因此 postinst 脚本的使用对于我们的目的来说特别方便。

附带说明,Debian 软件包将存储在我们内部管理的服务器存储库中。

在这个阶段,我已经使用 dh_make 来创建 Debian 目录和相关文件(例如,规则、控件等),但是生成的规则文件对于我的目的来说似乎有点过头了.

根据此描述,我真正需要“规则”文件做的只是将文件从源目录(或存档内)复制到如下所示的目标目录

/opt/company_product/3rd_party_binaries/bin
/opt/company_product/3rd_party_binaries/etc
/opt/company_product/in_hourse_binaries/bin
/opt/company_product/in_hourse_binaries/etc
/opt/company_product/ruby
/opt/company_product/rails_project
/opt/company_product/etc
/opt/company_product/shared/logs
/opt/company_product/shared/tmp
/opt/company_product/shared/license

...等等。

我已经阅读了 Debian 政策手册和一些操作指南,它们表明您不应该更改规则文件以使用 mkdir 创建目录,并且通常有一个 dh_ 应用程序(例如,dh_installdirs 等),几乎可以满足任何安装目的的需求。这些 dh_ 相关应用程序的手册页充其量只是粗略,我是一个“示例”类型的人。

也就是说,我有点迷茫,最好的方法是让我的 rules 文件将我的各种预编译二进制文件和 Ruby/Rails 文本文件安装到所需的位置。

这是我最初的 rules 文件。它几乎是 dh_make 创建的标准样板规则文件。我的想法是我应该注释掉除 install 之外的所有部分,然后在该部分中找到适当的命令来创建目录、复制文件等。

非常感谢任何意见或建议。

#!/usr/bin/make -f

package = testapp

CC = gcc
CFLAGS = -g -Wall

ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
  CFLAGS += -O2
endif

#export DH_VERBOSE=1

clean:
        dh_testdir
        dh_clean
        rm -f build

install: build
        dh_clean
        dh_installdirs
        echo "Place the Install Script here"
        cp $(CURDIR)/testapp-2.0.tar.gz $(CURDIR)/debian/$(package)/opt/testapp-2.0
        echo "Finished copying folders"


build:
        touch build

binary-indep: install
# There are no architecture-independent files to be uploaded
# generated by this package.  If there were any they would be
# made here.

binary-arch: install
        dh_testdir -a
        dh_testroot -a
        dh_installdocs -a 
        dh_installchangelogs -a 
        dh_strip -a
        dh_compress -a
        dh_fixperms -a
        dh_installdeb -a
        dh_shlibdeps -a
        dh_gencontrol -a
        dh_md5sums -a
        dh_builddeb -a

binary: binary-indep binary-arch

.PHONY: binary binary-arch binary-indep clean checkroot

【问题讨论】:

【参考方案1】:

虽然你已经有了自己的答案,但我还是要指出几点。

您似乎以非常复杂的方式执行此操作。如果您只是需要将文件复制到某些目录中,请使用以下格式编写debian/mypackagename.install

path/to/file/relative/to/source/root path/to/install/relative/to/system/root

(不要在/usr/opt 或任何您的目标目录之前添加/。阅读man dh_install 了解更多信息)

那么你的debian/rules可以是:

#!/usr/bin/make -f

%:
    dh $@

如果您的源根目录中有某种 makefile 等,则将其附加到上述 rules 文件中:

override_dh_auto_build:

override_dh_auto_install:

不要忘记将7 放入debian/compat

此外,您不应将文件安装到/opt//usr/local/ 等。这些文件适用于由 Debian 软件包安装的文件。 Debian 建议安装在/usr/share/yourcompany/ 中。正如juzzlin 在下面指出的,Ubuntu 软件中心可能有不同的要求。

更具体地说,您的 mypackage.install 文件应如下所示:

src/bin/* usr/bin
src/etc/* etc/

【讨论】:

很好的建议。一旦我这样做了,我应该使用哪个命令来构建 deb 包? 好的,我运行了 dpkg-buildpackage 并得到了一个 .deb 文件,但是当我在目标服务器上安装它时,它并没有运行我的 debian/mypackagename.install 文件。另外,如果我有 init.d 下的脚本,我应该把它们放在哪里? 这是我的目录结构:build_deploy.rb build_package.rb debian docs extras Rakefile src test.txt。在 src 下如下: bin console created_vipre.sql etc filter install.rb opt spf transport。我想要的只是有一个 .deb 文件,其中包含 src 下的所有内容。然后,我希望将确切的结构复制到目标系统上的 /opt/vipre。然后我希望将 src/etc/init.d 下的所有内容复制到 /etc/init.d。我不知道为什么我不能得到这个。看起来很简单,但文档让我感到困惑。请帮忙。非常感谢。 本质上,debhelper 所做的是,如果它不知道如何安装(我们没有像 makefile 或 python 的 distutils 这样的构建系统,如果有,我们会如上所述覆盖它)是它读取debian/mypackage.install 和dh_install 然后将源文件放入目标临时目录(创建.deb 的目录)。因此,您的 debian/mypackage.install 应该像我将要放入已编辑答案的那个。您可以运行debbuild 来生成包。这样做通常更容易。 关于 /opt 的旁注:例如,Ubuntu 软件中心需要/必需,应用程序安装到 /opt。【参考方案2】:

您可以安装 cdbs 并像这样更改规则文件

#!/usr/bin/make -f

include /usr/share/cdbs/1/rules/debhelper.mk

binary-install/package_name::
                   mkdir debian/$(cdbs_curpkg)/destination_path 
                   cp path_of_your_files  debian/$(cdbs_curpkg)/destination_path

【讨论】:

以上是关于我需要我的 Debian 规则文件来简单地将文件复制到它的目标的主要内容,如果未能解决你的问题,请参考以下文章

如何简单地将opencv包含在CMake的项目中

简单快速有效地将PDF文件转换成Word

如何轻松地将 CSV 文件处理为 List<MyClass>

如何在 Dockerfile 中复制配置文件?

有效地将numpy数组写入二进制文件

debian6保存iptables规则