我有一个 Qt 应用程序,我想将其部署为 deb 包。我读过很多资料,都略有不同 - 我所做的大部分工作都遵循这个如何:准备提交到 Ubuntu 软件中心的应用程序
我必须在其中创建一个文件夹结构/usr/share/My Company's Folder/
(路径中的空格和特殊字符是一个不幸的要求;大写名称也是如此...该程序是从 Windows 移植的)。
/usr/share/My Company's Folder/MainProject/content
我创建了一个包...它似乎可以工作,安装在正确的位置,而且令人惊讶的是该程序甚至在那之后就可以工作了。
问题:我不能在路径名中使用空格。我创建了一个“安装”文件,如上面的链接所示。它按预期工作 - 但如果我想放置项目,就会出现错误/usr/share/My Company's Folder/
- 我只能通过使用/usr/share/MyCompanyFolder/
(无空格或特殊字符)才能使其工作。
设置:
~/working_directory
mainproject-1.0
mainproject_1
content
mainproject-1.0.tar.gz
mainproject-1.0
我跑了进去
dh_make --copyright gpl -f ../mainproject-1.0.tar.gz
选择 s,按回车键...然后我修改了创建的 debian 文件夹中的文件。
在 debian 文件夹中也创建了一个“安装”文件:
mainproject_1/* /usr/share/My Company's Folder/MainProject
冉
dpkg-buildpackage -rfakeroot [email protected]
它起作用了,创建了安装程序,安装程序起作用了......
但我无法创建带有空格的文件夹路径,而这正是我真正需要的。
笔记:
尝试失败
"/usr/share/My\ Company\'s\ Folder/"
"/usr/share/My Company's Folder/"
/usr/share/My\ Company\'s\ Folder/
/usr/share/My\040Company's\040Folder/
/usr/share/My?Company's?Folder/
经过多次搜索我发现了这个信息
you can't install files with space with dh_install (= debian/*install files)
you have to rename/install them explicitly in debian/rules with install, mv or cp
e.g. with dh tiny rules:
override_dh_install
dh_install
install -m 644 "fi le" "debian/tmp/usr/share/fi_le"
因此我尝试在 debian/rules 文件中添加(显示行号)
12 %:
13 dh $@
14
15 override_dh_install:
16 dh_install
17 install -m 644 "debian/mainproject/usr/share/MyCompanyFolder" "debian/mainproject/usr/share/My Company's Folder"
最新错误-使用此命令:
make[1]: Entering directory `/home/me/working_directory/mainproject-1.0'
dh_install
install -m 644 "My Company's Folder" "debian/mainproject/usr/share/MyCompanyFolder"
install: cannot stat `My Company's Folder': No such file or directory
make[1]: *** [override_dh_install] Error 1
make[1]: Leaving directory `/home/me/working_directory/mainproject-1.0'
make: *** [binary] Error 2
dpkg-buildpackage: error: fakeroot debian/rules binary gave error exit status 2
或者尝试
12 %:
13 dh $@
14
15 override_dh_install:
16 dh_install
17 mv -r "debian/mainproject/usr/share/MyCompanyFolder" "debian/mainproject/usr/share/My Company's Folder"
结果,debian 内部的文件夹结构看起来正确,但我收到有关无效文件夹的错误......
objdump: 'debian/mainproject/usr/share/My': No such file
objdump: 'Company's': No such file
.....
mkdir 然后 cp 应该具有与 mv 相同的结果,但不幸的是,它们一直将一个文件夹放在另一个文件夹中...... * 被视为实际名称......
看来我真的一事无成。
更新:我的问题的答案是,在 postinstall 文件中使用 mv 命令。
答案1
这是一个诡计
There is directories layout:
mytest-0.1/debian/changelog
/compat
/control
/install
/rules
mytest-0.1/usr/share/my company/file_a
/file_b
/file_c'
调整安装文件如下
usr/share/ /usr/
然后打包你的 deb 包
$mytest-0.1>dpkg-buildpackage -rfakeroot -uc -us -tc
希望它能帮助你
答案2
好吧,你最后使用 postinstall 的方法是个好办法。但你第一次尝试失败的原因其实是,Debian 安装脚本中的补丁(即 debian/rules debian/install,也可能是其他东西)是基于 Debian 软件包的,而不是你在计算机上所想的路径。它是与整个软件包文件夹进行比较的路径。这就是为什么它会给你输出“没有这样的文件”的原因
抱歉我的英语不好,我希望我能正确理解你的问题并解释清楚。
如果我是你,我会向我认识的 Debian 维护者寻求帮助,或者查看其他人打包的其他软件包。(你可以在终端中轻松获取大多数软件包的源代码)
答案3
您的上一个示例在 mkdir 中没有 -p 参数,因此目录未在指定路径中创建。其余的应该可以正常工作。名称中包含引号等特殊字符时,您会不断遇到问题,但如果要求安装到这样的名称,那么只需安装到普通目录,然后在最后重命名它的方法就很好。您可以避免脚本中所需的引号带来的所有无意义,并让最终用户处理它。当最终用户的呼声足够高时,也许会发生一些合理的事情,例如不必在 Linux 系统上使用这样的名称,否则它们会造成问题。