软件研发

NPM作为Python项目的构建工具

2020-10-14 17:21:38 | 来源:中培企业IT培训网

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的问题,请继续关注中培伟业。

标签: Python 软件研发