抱歉,我写了这么多,但我只是想为我的问题提供一个良好的背景。实际上,这里有一百万个问题,因为我完全糊涂了。我最近学习了一些 Python 编程,并制作了一个 Windows 应用程序。现在我想为 Ubuntu 实现该应用程序和其他一些想法,并将它们作为开源 GPL-3 发布。不过,我希望代码可以在任何系统上运行(或者至少在 Ubuntu 和 Windows 上运行)。
因此,为了了解 Ubuntu 打包的工作原理,我查看了最近在 App Developer Showdown 中使用的 quick 应用程序。但是它创建的文件夹结构和文件对我来说毫无意义。所以我阅读了Ubuntu 打包指南和申请审核流程那里有所有的链接,以及Debian Python 政策。但所有这些文字只是让我对快速创建文件和文件夹的方式更加困惑。
快捷方式?
因此,这是我快速理解的(假设我的项目名称是proj):
proj/bin
= 一个将被复制到 /usr/share/bin/proj.py 的单个文件,以便从全局路径运行应用程序?但这会违反“应用程序审查流程”规则,对吗?
proj/data/*
= 应该放在 /usr/share/proj/* 下的文件,对吗?但这也会违反“应用程序审查流程”规则?
proj/help/C/*
= 一些 HTML 文档,我认为,应该放在 /usr/share/doc/proj/ 下,并且与“应用程序审查流程”配合良好,但为什么文件夹名称是“C”而不是“proj”?
proj/tests/
= Python 中“测试”包的某种文件。我想这很棒,期待了解它是什么。
proj/proj/
= 一些似乎只是链接到 proj_lib 文件夹中的新文件的文件?似乎没有必要,我不明白为什么这些在这里。
proj/proj_lib/
= 实际的源代码,我猜?
然后很快就创建了proj/apport
,proj/etc/apport*
但我不知道它们做什么或为什么添加它们。
现在,真正令人困惑的部分是文件结构。它看起来不像我以前见过的那样。说实话,它看起来非常不必要的复杂化。在本节下面,我将描述我制作自己的项目文件结构的方式,这可能有助于解释为什么这对我来说如此令人困惑。但首先,我对快速方式的理解(请注意,此时我的理解可能是错误的)。
首先,setup.py
。此文件包含一个名为 update_config() 的函数,它只是加载另一个名为 proj/proj_lib/projconfig.py 的文件。但该 config.py 文件似乎不包含任何有用的内容,可以与 setup.py 分开保存?实际上,我从未见过有人建议将很多东西放入 setup.py 文件中。setup.py 还包含指向 SVG 图标的硬编码文件名,否则只会将 desk.in 文件复制到自身上,那么为什么不直接在 desk.in 文件中进行更改,而不在 setup.py 中使用这个函数呢?然后还有另一个函数可以创建子目录 proj/data/share/proj 并将 desk.in 文件复制到那里,我不明白它的用途?既然您原本可以将文件放在那里,为什么还要有一个执行此操作的函数呢?然后在所有这些无意义的代码之后,会出现一些实际上看起来像常规setup.py的东西。
现在proj/bin/proj.py
,我假设应该使用 来启动应用程序?这似乎只是在之前未声明的 syspath 变量中将 /usr/ 重新映射到 /opt/extras.ubuntu.com/。所以我猜这是为了适应“应用程序审查流程”中针对使用所有其他 Linux 版本标准的文件夹名称的应用程序的规则?公平地说,我不明白,但我可以接受。在重新映射目录之后,此文件继续调用 proj/proj/在里面.py。
proj/proj/__init__.py
是定义如何启动模块的标准方法,我想?但是,该文件并没有实际执行某些操作的代码,而是继续运行位于另一个文件中的主窗口类。
proj/proj_lib/
还有在里面.py 文件,我不明白它的用途。然后有一个 Window.py,它似乎包含应用程序的实际功能,并调用其他窗口 py 文件,例如有关对话框等。
我开发应用程序的方式
我的文件夹结构如下:
proj/
proj/ui
proj/imageformats # necessary for imports to work
proj/sqldrivers # necessary for imports to work
在proj/
文件夹中,我有 setup.py 和启动应用程序的 proj.py。在我的 proj.py 文件中,我拥有所有主窗口功能,使用导入调用一些其他窗口和函数,并且在此文件的末尾是主要的() 函数启动应用程序。
该proj/ui/
文件夹包含我用 Qt Designer 制作的所有 .ui 文件。
其他文件夹仅用于提供一些文件,这些文件将使应用程序在使用 py2exe for Windows 打包时可以工作。基本上,它们是通过 Ubuntu 中的依赖项提供的文件。
请注意,我使用的这个设置非常适合 Windows 开发。我使用 py2exe 构建一个可执行文件,该文件最终位于一个proj/dist/
文件夹中,我只需复制此文件夹中的文件,它就可以在任何 Windows 机器上运行。
我该如何将它们结合起来?
我花了几天时间尝试阅读文档。除了基本教程和 App Developer Showdown Workshops 上的内容外,我几乎找不到任何内容。我找不到任何可以帮助我理解 quick 建议的文件夹结构的内容。
从我读到的内容来看,我可以使用 来os.environ['HOME']
创建 Ubuntu 上 ~/.config/proj.conf 或 Windows 上 C:/Users/username/.config/proj.conf 的路径。到目前为止,我可以保留跨平台代码。但是,随着 /bin 和 /etc 以及 /opt 的划分,我将开始遇到一些问题。当然,作为最后的手段,我可以保留两份代码副本 - 一份为 Ubuntu 设置,一份为 Windows 设置。但我仍然希望有一个类似的文件夹结构,以便轻松传输代码更改。
应该有人已经对此有一个很好的解决方案。也许那个人还可以(除了给出如何使其跨平台的示例之外)描述为什么在默认的快速设置中会有如此长的文件链调用其他文件,这些文件又调用其他文件?当然,我现在假设快速使用某种针对 Ubuntu 的推荐模型。如果不是这种情况,我想获得有关通过 Ubuntu 存储库分发应用程序的推荐文件夹结构的建议?
答案1
在谷歌上搜索了大量 Ubuntu 或 Debian 专用页面后,我发现这个这实际上相当有帮助。基本上,建议保持如下形式:
proj/
proj/bin/proj.py # this will just "import proj" and "main()"
proj/proj/__init__.py # this will just "import window.py" and run that
proj/proj/window.py # main functionality
proj/proj/submodule/__init__.py # import in window.py
proj/proj/test/ # for that test package that quickly also uses
proj/README # basic readme file
proj/setup.py # standard distutils setup.py
对我来说,这听起来比快速方法更合理,也更接近我原来的方法。而且将它制作成遵循 Ubuntu 指南的 Debian 软件包应该不是不可能的吧?所以我想我会删除快速内容并执行此操作。除非有人有更好的建议?
那么剩下的就是“我该如何设置它以便在 Ubuntu 和 Windows 上顺利安装?”,即我应该以特殊方式编写 setup.py 代码还是在代码中做出其他考虑...