我正在编写软件,允许人们将数学书籍作为网站发布。它主要基于Python + Flask,但为了处理方程,我使用的是MathJax。MathJax可以在客户端或服务器端使用(通过MathJax节点)。在后一种情况下,我必须使用npm
将MathJax节点安装在我的主Python脚本可以访问的某个地方,然后从脚本中调用它。在前一种情况下,我必须提供 MathJax.js 作为可供客户使用的资产(目前我使用 Flask 的send_from_directory
函数)。
我的问题是:在 Python 中处理这种异构依赖的最佳实践是什么?我的目标是至少在类 unix 系统(Linux 或 MacOS)上使安装过程尽可能简单,前提是node
和npm
已经可用。
我可以把我需要的所有 JavaScript 源代码都放到我的发行版本身中,但也许有更好的方法可以做到这一点?
我的问题是:处理此类问题的最佳实践是什么 Python 中的异构依赖关系?
对于节点依赖项,我会在目录中包含一个package.json
文件,该文件指定所需的节点依赖项。对于其他语言/包管理器,我也会使用指定依赖项的传统方式(例如,为 Ruby 依赖项添加 Gemfile)。
Python/Flask 提出的另一个常见示例是将 Bower 包管理器用于静态前端依赖项。在这种情况下,依赖项在bower.json
文件中指定,并且通常被拉入 Flaskstatic
目录中的 bower 文件夹中。
我可以把我需要的所有javascript源代码放到我的发行版中 本身,但也许有更好的方法可以做到这一点?
一旦你得到了指定依赖项的package.json
,你就可以通过运行npm install
来获取和安装所需的所有 Node 依赖项,在我看来,这是一个比将 javascript 源代码包含在项目中更优雅的解决方案。
现在您有多个包管理器(例如,除了对 Node 依赖项使用npm
之外,您可能还对 Python 依赖项使用pip
),您可能希望创建一个 Makefile 或一些部署/构建脚本来使用所有这些组件获取/安装(例如,如果我使用 Travis CI,除了pip install -r
之外,我还会更新我的.travis.yml
以调用npm install
)。
使用 Node.js package.json 将是处理 JavaScript 依赖项的最佳解决方案。至于从.py执行可执行文件,您可以参考此答案 从 Python 运行 shell 命令并捕获输出。默认情况下,节点依赖项位于 ./node_modules 内,与 package.json 文件的位置位于同一目录中。
对于安装新的依赖项:
npm install --save npm-package-you-want-to-install
准备好它们后,此命令将为您安装所有内容:
npm install
节点依赖绝对是处理事情的更优雅的方式,因为javascript是一个不断发展的世界,并且查看package.json比许多简单地调用所述脚本的脚本标签/函数要容易得多。如果你想要一个自动化系统,我的建议是制作一个可执行文件(.sh),它将为两者运行分期付款,你可以在未来的项目中使用它。
我建议使用 webpack Webpack.js而不是 Bowerjs。NPM 和他的 package.json 非常适合依赖项更新,但从 node_modules 引用库有点尴尬。