我有一个Django项目,该项目使用的是我尚未通过virtualenv中的pip安装的外部软件包,而是通过git clone获得的,现在我想知道将其放置在何处以及文件夹的名称应如何.外部包装为:Evernote Python3 SDK
这是我当前的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文件夹中.我还将实用程序函数放在libs下的一个名为utils的包中
现在,我知道关于如何像下面两个这样的项目结构有很多建议:
而且我也知道Python不会强迫您使用教条式文件夹结构.但是,尽管如此:我对包装,包装命名和包装结构没有深刻的了解.
>将外部软件包放在(Django)项目根文件夹下是否是一种好习惯?
>将我所有与我的特定Django应用程序无关的软件包/库放在一个名为libs或utils或src的文件夹中是否有意义?
编辑:我也看不到有关如何使用这些文件夹名称的最佳最佳实践:
> src
> lib
>工具
最佳答案
通常,推荐的工作流程如下:
>您的virtualenv应该已经从版本控制中排除(例如,使用.gitignore或.hgignore).如果不是,请立即执行.
>尽可能将内容从PyPI安装到您的virtualenv中,而不是从GitHub或其他地方下载它们.
>如果必须在PyPI上安装某些东西,请使用格式shown in the reference manual之一传递git:// …之类的URL来进行pip安装.如果需要固定到特定的提交,请同时传递-e进行安装,并在URL中包含提交标识符.否则,依赖关系将有效地“活跃”起来,将来您可能无法恢复到该确切的提交.
>如果由于某种原因您必须维护其他人项目的本地分支(例如,因为您正在该项目上运行2to3?),那么按照您的建议进行操作可能很有意义.克隆(或下载(视情况而定))后,使用pip install -e ./libs/libfoo安装.不建议这样做,因为您需要定期从上游拉入或向后移植更改,这非常耗费人力.使用这种方法的版本控制也很麻烦,因为您可能没有可用于三路合并的上游历史记录(有ways around this-注意Linus显示的命令可能不是当今最好的方法).
>安装完所需的所有文件后,请使用pip Frozen生成一个requirements.txt文件,将所述文本文件粘贴到Django项目目录中,然后将其检入版本控制中.该文件应该足以从上游源完全重新生成所有依赖项,而无需将任何依赖项检入源代码控制中(当然,除非您执行的是#4).
>定期执行pip install -U并针对较新版本的依赖项运行回归测试,然后重做pip冻结并将更改检查到版本控制中.当依赖关系破坏向后兼容性或引起其他问题时,您还可以根据需要手动编辑requirements.txt文件.