Python是一种功能强大的语言,个人比较喜欢python。但是一直觉得python缺少了一些东西。就像你从来没有约会过的漂亮女孩。与使用带有npm的NodeJ的项目相比,为中型到大型Python项目设置工作环境确实非常困难,接下来让我们来探讨几种可以使用npm帮助python解决此问题的方法。
1.执行脚本
每个NodeJs项目都有一个package.json文件。您可以在一个文件中定义从版本到依赖关系,脚本到自定义配置的所有内容。运行脚本非常简单,
npm运行<脚本名称>
与Python相比有什么不同?
python中用于设置项目的一个标准选项是setuptools软件包。基本的元数据配置(例如名称,版本和作者)很简单。它还提供了许多复杂的选项,例如cmdclass和scripts。但是,即使是简单的操作(例如删除一些自动生成的文件)也相当困难。
例如,假设您需要coverage/在运行测试套件后删除目录中的所有文件。在python中,如果要自动执行此任务,则需要做几件事。
1). cmdclass在setup.py(setuptools正在使用的地方)下添加一个条目
2). 编写一个新的Python类扩展distutils.command基类
3). 编写一个python代码,该代码将用于subprocess.Popen执行所需的命令。
"clean_cov": "rm -rf coverage/*"与在package.json文件中添加一行条目相比,这需要大量的工作。这里的另一个好处是,您可以链接npm命令来耦合任务。
"clean_cov": "rm -rf coverage/*",
"test": "python setup.py测试",
"test_and_clean": "npm run test && npm run clean_cov"
您还可以添加pre和post脚本来定义流程。上面的代码可以写成
"test": "python setup.py测试",
"posttest": "rm -rf coverage/*",
另一方面,我对将一些构建命令集成到项目的源代码感到不舒服。
2.配置git hooks
我个人认为pre-commit和pre-push git钩子是git存储库的重要元素。这些是无名英雄,可以避免对存储库的意外提交,从而有助于使用干净的提交维护干净的存储库。
在我正在从事的项目中,我们计划有与以下检查相对应的挂钩。
1). 运行pylint检查并评估目标文件的pylint分数;
2). 运行pytest并确保所有测试都通过;
3). 避免承诺掌握和发展分支机构;
4). 确保没有禁止的单词;
5). 创建源发行版,并确保没有构建错误。
只有5个,还有更多支票。显然,手动运行这些检查不是一种选择。所以我需要配置钩子。
我发现了几个pip包,包括git-pylint-hook,git-pre-push-hook和pre-commit,它们似乎可以满足我的要求。但是我找不到的任何库都没有适当的文档。自定义插件似乎是一场噩梦。
我甚至觉得手动编写一些shell脚本比找到合适的python插件容易。
现在,让我们看看如何在package.json文件存在的情况下完成此操作。
我找到了这些用于工作的预提交和预推送库。由于我已经在程序包中包含用于运行上述检查的自定义脚本,因此我要做的就是安装库并将相关条目添加到package.json文件中。例如,我将预推挂钩配置如下,
“ pre-push”:[
“ git-branch”,
“ forbidden-words”,
“ pylint”,
“ test”,
“ build”
]
现在,这很容易吧。我还要在这里强调pre和post脚本也可以在这里工作。但是,对于我们的项目,我们希望明确指定检查。
3.观看模式
为了解释为什么需要此功能,我首先要提到我使用intelliJ PyCharm作为编写Python代码的IDE。我希望在不久的将来看到pycharm中缺少的一项功能,它是有关IDE中pylint问题的实时反馈。
在他们将该功能添加到pycharm中之前,我最好的选择是将pylint配置为外部插件,并在更新python文件之前手动运行它。
但是,有了我的救主的帮助package.json,这变得容易了。在NPM-手表库(和其他类似的库)为我们提供了观看在给定的目录中的特定文件类型更改,然后执行一个脚本NPM的选择。
例如,我们可以有一个如下所示的条目,以便在每次.py更改时运行pylint 。
“ watch”:{
“ pylint”:{
“ patterns”:[
“ app / ** / *”,
“ utils / ** / *”
],
“ extensions”:“ py”,
“ quiet”:true
}
}}
最后的想法
尽管我真的很喜欢package.json在python项目仓库中有一个文件,但是我收到了这种方法的混合反馈。一些开发人员对此不以为然,认为这种方法不是python。
我个人没有发现不是python的问题,因为我认为工程师应该与技术无关,所有这些语言仅仅是完成某些工作的工具。尽管如此,为了尊重所有队友的需求,我在不使用npm的情况下配置了此仓库中提到的所有基本内容。想了解更多关于python的问题,请继续关注。