我需要我的 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 规则文件来简单地将文件复制到它的目标的主要内容,如果未能解决你的问题,请参考以下文章