标签:开源 熟悉项目 base install 规模 main 定位 change 手动安装
软件开发是一个系统工程,当然编码实现是其中尤其重要的一个环节,关乎到功能需求的实现好坏。这个环节中除了编码这一硬功之外,与之相关的编码风格这一柔道,虽然没有直接决定功能的实现与否,但却在很大程度上决定了的项目代码整体的可读性、健壮性、移植性、可维护性等重要特性。编码风格不仅涉及到代码如何编写,也涉及到代码模块的分布组织,即项目代码目录的设计。
好的代码目录设计可以直观展现开发者的逻辑条理,提高代码的可读性、可维护性、移植性甚至是健壮性,不好的代码目录设计就不细说了,逻辑层次混乱不清,代码拷贝到其他环境不能运行等是最常见的问题了。
今天就来谈谈软件目录开发设计规范相关的事宜。
在上文中略微提到软件项目代码目录设计规范对项目的一些影响,这里细化展开一下其重要性和必要性,大致为以下几点:
仅以Python为例,谈谈建议的软件开发目录组织结构:
Foo/
|-- bin/
| |-- foo
|
|-- foo/
| |-- tests/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py
| |--conf/ | |-- __init__.py | |-- settings.py | |--logs/
|
|-- docs/
| |-- conf.py
| |-- abc.rst
|
|-- setup.py
|-- requirements.txt
|-- README
解释如下:
1. bin/: 存放项目的一些可执行文件,当然起名scripts/之类的也未尝不可
2. foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/
存放单元测试代码; (3) 程序的入口最 好命名为main.py
。
3. conf/: 存放配置文件
4. logs/: 作为日志目录存放程序运行中生成的各种日志
5. docs/:存放项目的帮助文档
6. setup.py:安装、部署、打包的脚本,一般用于适配环境、解决依赖关系等
7. requirements.txt: 存放软件依赖的外部python包列表
8. README:存放项目说明文档,下文详述
除此之外,有一些方案给出了更加多的内容。比如LICENSE.txt
,ChangeLog.txt
文件等,其中LICENSE.txt主要是项目开源的时候需要用到。ChangeLog.txt可根据需要确定是否添加。
使用过开源软件的朋友们都知道README可以给软件的使用带来很大的帮助,包括软件介绍、功能定位、安装启动使用方法、有建议或bug怎么联系作者等,其必要性和重要性不言而喻。
因此每一个项目都应该有README说明,好的README应该至少包括以下几方面的内容:
如果再编写的更详细,可以考虑简述软件的基本原理。这方面最好的参考就是开源软件的README,如nginx,redis等。
requirements主要解决以下两个问题:
requirements.txt的格式是每一行包含一个包依赖的说明,通常是flask>=0.10
这种格式,要求是这个格式能被pip
识别,这样就可以简单的通过 pip install -r requirements.txt
来把所有Python包依赖都装好了。具体格式说明: 猛击这里。
一般来说,用setup.py
来管理代码的打包、安装、部署问题。业界标准的写法是用Python流行的打包工具setuptools来管理这些事情。这种方式普遍应用于开源项目中。不过这里的核心思想不是用标准化的工具来解决这些问题,而是说,一个项目一定要有一个安装部署工具,能快速便捷的在一台新机器上将环境装好、代码部署好和将程序运行起来。
这个问题好比在linux通过yum来安装一个软件一样,我们不得不承认,在解决环境依赖关系方面,yum安装相对于源码编译安装更方便。
在python项目方面,对于初学者来讲,很多都经历过以下问题:
setup.py的目的是
将这些事情自动化起来,统一自动化管理,提高效率并减少出错的概率。"复杂的东西自动化,能自动化的东西一定要自动化。"是一个非常好的习惯。
setuptools的文档比较庞大,刚接触的话,可能不太好找到切入点。先从模仿开始吧,可以参考一下Python的一个Web框架,flask是如何写的: setup.py
如果开发的项目只是在Linux环境上运行,简单点自己写个安装脚本(deploy.sh
)替代setup.py
也未尝不可。
conf.py
放在源码目录下,而是放在docs/
目录下。很多项目对配置文件的使用做法是:
import conf
这种形式来在代码中使用配置。这种做法我不太赞同:
conf.py
这个文件。所以,我认为配置的使用,更好的方式是,
能够佐证这个思想的是,用过nginx和mysql的同学都知道,nginx、mysql这些程序都可以自由的指定用户配置。
所以,不应当在代码中直接import conf
来使用配置文件。上面目录结构中的conf.py
,是给出的一个配置样例,不是在写死在程序中直接引用的配置文件。可以通过给main.py
启动参数指定配置路径的方式来让程序读取配置内容。当然,这里的conf.py
你可以换个类似的名字,比如settings.py
。或者你也可以使用其他格式的内容来编写配置文件,比如settings.yaml
之类的。
-------------------------atm.py------------------------------- print(__file__)#返回当前程序的相对路径 import os import sys print(os.path.abspath(__file__)) #返回绝对路径 print(os.path.dirname(os.path.abspath(__file__)))#返回上级路径 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append((BASE_DIR)) from conf import settings from core import main main.login() ---------------------------main.py------------------------------------ def login(): print("Welcome to my atm")
标签:开源 熟悉项目 base install 规模 main 定位 change 手动安装
原文地址:https://www.cnblogs.com/cjaaron/p/8993182.html