我有一个Django项目,该项目使用的外部软件包尚未在我的virtualenv中通过pip
安装,而是通过git clone
获得,现在我想知道将其放置在哪里,以及文件夹名称应如何。外部软件包是这样的:Working example in rextester.
这是我当前的Django项目结构:
➜ (venv:evernote) evernote_bear_project git:(master) tree
.
├── README.md
├── bear2evernote
│ ├── static
│ └── templates
├── config
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── libs
│ ├── evernote-sdk-python3
│ (omitted)
│ └── utils
│ ├── __init__.py
│ └── file_utils.py
└── manage.py
我已将此软件包evernote-sdk-python3
放在Django项目文件夹中名为libs
的文件夹中。我还将实用程序功能放在utils
下的名为libs
的程序包中
现在我知道关于如何像下面两个这样的项目结构有很多建议:
[2] Structuring Your Project — The Hitchhiker's Guide to Python
我也知道Python不会强迫您使用教条式文件夹结构。但是,尽管如此:我对包装,包装命名和包装结构没有深刻的了解。
将外部软件包放在(Django)项目根文件夹下是否是一个好习惯?
将所有与我的特定Django应用程序无关的软件包/库放在一个名为libs
或utils
或src
的文件夹中是否有意义?
编辑:对于如何使用这些文件夹名称,我也没有明确的最佳实践:
src
lib
utils
答案 0 :(得分:4)
通常,推荐的工作流程如下:
.gitignore
或.hgignore
)。如果不是,请立即这样做。git://...
这样的URL传递给pip安装。如果您需要固定到特定的提交,请也传递-e
进行安装,并在URL中包括一个提交标识符。否则,依赖项将有效地“活跃”起来,并且您将来可能无法重新获得确切的提交。pip install -e ./libs/libfoo
安装。不建议这样做,因为您需要定期从上游拉入或向后移植更改,这非常耗费人力。使用这种方法的版本控制也很麻烦,因为您可能没有可用于三路合并的上游历史记录(有ways around this-请注意,Linus显示的命令可能不是当今最好的方法)。 / li>
pip freeze
生成requirements.txt文件,将所述文本文件粘贴到Django项目目录中,然后将其检入版本控制中。此文件应该足以从上游源完全重新生成所有依赖项,而无需将任何依赖项检入源代码控制中(当然,除非您执行的是#4)。pip install -U
并针对较新版本的依赖项运行回归测试,然后重做pip freeze
并将更改检查到版本控制中。当依赖项破坏向后兼容性或导致其他问题时,您还可以根据需要手动编辑requirements.txt文件。