【问题标题】:javascript dependencies in python projectpython项目中的javascript依赖项
【发布时间】:2017-10-26 10:03:27
【问题描述】:

我正在编写允许将数学书籍作为网站发布的软件。它主要基于 Python + Flask,但为了处理方程式,我使用的是 MathJax。 MathJax 可用于客户端或服务器端(通过MathJax-node)。在后一种情况下,我必须使用 npm 将 MathJax-node 安装在我的主 Python 脚本可访问的某个位置,然后从脚本中调用它。在前一种情况下,我必须提供 MathJax.js 作为资产,供客户端使用(目前我使用 Flask 的 send_from_directory 函数)。

我的问题是:在 Python 中处理这种异构依赖项的最佳实践是什么?我的目标是至少在类 unix 系统(Linux 或 MacOS)上尽可能简化安装过程,前提是 nodenpm 已经可用。

我可以将我需要的所有 javascript 源代码放入我的发行版本身,但也许有更好的方法来做到这一点?

【问题讨论】:

  • softwareengineering.stackexchange.com 可能更适合这个问题
  • @WhiteHotLoveTiger 在引用其他网站时,指出cross-posting is frowned upon 通常会有所帮助
  • @gnat 很高兴知道。我没有意识到这一点。在这种情况下迁移是否合适?
  • @WhiteHotLoveTiger,谢谢,我不知道那个网站。如何将我的问题迁移到那里?似乎 close → offtopic → 这个问题属于另一个 SE 站点”给了我一些站点,但不是 *softwareengineering 作为可能的迁移目标。
  • 我已经为这个特定的用例创建并发布了calmjs 项目,前提是nodenpm 可用,集成包(例如calmjs.webpack)应该可以工作。至少,使用 Calmjs 可以声明一个package.json,它作为给定 Python 包的一部分作为其元数据持久化,以供其依赖项重用。

标签: javascript python dependency-management


【解决方案1】:

我的问题是:处理此类问题的最佳做法是什么 Python 中的异构依赖?

对于节点依赖项,我会在指定所需节点依赖项的目录中包含一个package.json 文件。对于其他语言/包管理器,我也会使用任何指定依赖项的常规方式(例如,为 Ruby 依赖项添加 Gemfile)。

Python/Flask 提出的另一个常见示例是使用 Bower 包管理器来处理静态前端依赖项。在这种情况下,依赖项在 bower.json 文件中指定,并且通常被拉入 Flask 的 static 目录中的 bower 文件夹中。

我可以将我需要的所有 javascript 源代码放入我的发行版中 本身,但也许有更好的方法来做到这一点?

一旦你获得了 package.json 并指定了依赖项,你就可以通过运行 npm install 来获取并安装所需的所有 Node 依赖项,在我看来,这比将 javascript 源包含在项目。

现在您已经拥有多个包管理器(例如,除了 npm 用于 Node 依赖项之外,您可能还使用pip 来处理 Python 依赖项),您可能想要制作一个 Makefile 或一些部署/构建使用所有这些来获取/安装的脚本(例如,如果我使用 Travis CI,我会更新我的 .travis.yml 以调用 npm install 以及 pip install -r)。

【讨论】:

  • 谢谢!几个问题: 1. 如果我使用npm install 安装必要的节点包(如 MathJax-node),如何让 Python 脚本知道已安装包的位置? 2. 如果我希望我的包可以仅使用pip install <my-package-name> 进行安装,那么就不可能处理这个节点依赖关系,我说得对吗? (即不可能从setup.py调用npm install?)
【解决方案2】:

使用 Node.js package.json 将是处理 JavaScript 依赖项的最佳解决方案。至于从 .py 执行可执行文件,您可以参考这个答案Running shell command from Python and capturing the output。默认情况下,节点依赖项位于 ./node_modules 中,与 package.json 文件所在的目录位于同一目录中。

用于安装新的依赖项:

npm install --save npm-package-you-want-to-install

一旦你准备好了,这个命令就会为你安装好所有东西:

npm install

节点依赖绝对是更优雅的处理方式,因为 javascript 是一个不断发展的世界,查看 package.json 比许多简单调用所述脚本的脚本标签/函数要容易得多。如果您想要一个自动化系统,我的建议是制作一个可执行文件 (.sh),它可以分期运行,您可以在以后的项目中使用它。

【讨论】:

  • 谢谢!几个问题: 1. 如果我使用npm install 安装必要的节点包(如 MathJax-node),如何让 Python 脚本知道已安装包的位置? 2. 如果我希望我的包可以仅使用pip install <my-package-name> 进行安装,就不可能处理这个节点依赖关系,我说得对吗? (即不可能从setup.py调用npm install?)
  • node_modules 通常与 package.json 位于同一文件夹中。因此,如果 package.json 位于项目的根目录中,则 node_modules 也将如此。对于 py 脚本(npm install),上面的评论中有一个链接。
  • 是的,我知道如何从 python 调用npm install。我要求的是以下内容。 setup.py 基本上是对setuptools.setup 函数的调用,它会自动找到安装包的正确位置。但是,我无法执行(至少不知道如何)执行任意 python 命令(例如setuptools.setup 放置我的脚本的目录中的subprocess.run(["npm", "install"])。这就是为什么我无法理解我的 Python 脚本(在它们之后已安装)可以知道 JavaScript 依赖项的位置。
【解决方案3】:

我建议使用 webpack Webpack.js 而不是 Bowerjs。 NPM 和他的 package.json 非常适合依赖更新,但是从 node_modules 引用库有点尴尬。

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 2013-01-30
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    相关资源
    最近更新 更多