使用生成步骤打包Web应用程序的pythonic方法是什么?

时间:2015-09-26 19:59:19

标签: python node.js reactjs setuptools webpack

我有一个基于Python的网络应用,我试图将其打包为 setuptools 包,以便可以使用Router.configure({ trackPageView: true });和/或pip进行安装。此Web应用程序还包含React前端的静态文件。我使用 webpack (因此 node.js )为网站生成JavaScript包。我正在试图找出最经典的方法来打包它。通过谷歌搜索,我发现nodeenv似乎相关。

理想情况下,我希望这个包具有以下特征:

  • python setup.py xxxxxpip install安装时,不应安装python setup.py installnode,但已安装的软件包应该包含webpack输出。

  • webpack生成的输出应该需要检入源代码库。 (即需要在包装过程中的某个时刻生成。)

  • 当通过webpackpip install -e设置包以进行开发时,应该 安装python setup.py developnode(I怀疑前面提到的webpack在这方面会有用。)此时它还应该运行 nodeenv,以便之后webpack生成的内容存在

  • 如果这很容易,那么当virtualenv被激活时,webpack可以在“监视”模式下启动,并且当它被停用时停止(但是完全< / em>伸展目标。)

根据这些要求,我的预感是,我需要继承webpack命令,以便在源代码分发生成时生成webpack输出。我也猜测我需要继承sdist命令来注入仅限开发的需求。

这似乎是一个人必须穿过的桥梁。任何人有任何指针?

3 个答案:

答案 0 :(得分:0)

我认为您最好将这些问题分解为不同的构建步骤,如果我们稍微讨论您的流程,会出现这些步骤(假设nodenpm和{{ 1}}已安装在你的盒子上)

  1. 在本地virtualenv中安装所需的python模块。
  2. 安装webpack和运行webpack脚本所需的npm模块。
  3. 运行webpack配置,以便在本地编译静态资源。
  4. 这些步骤中的每一步都代表一个命令,最终可以在 Makefile 中结束,或者只是一个简单的shell脚本(如果你想坚持使用python,则使用Fabric)所以你最终会得到以下命令:

    • virtualenv
    • python-requirements
    • node-requirements
    • build-static - &gt; buildpython-requirementsnode-requirements

    现在您可以随意运行这些命令!如果您正在部署,则会运行build-static,例如,它会连续运行每个步骤。

答案 1 :(得分:0)

我们不是相同的部署系统,但寻求同样的事情:不需要生产节点,而是使用webpack构建最终部署。我们正在使用docker来运行临时构建机器......

构建器安装它需要的所有分发包,然后检出代码,调用setup.py来构建自己,运行无数测试,最后将构建目录部署到prod。

  1. 因此,我已将其留待Docker的配置,以确保nodejsnpm通过添加curl... && apt-get等安装到Dockerfile

  2. 我已经将sdist子类化,并修改了run命令,以便在命令行运行时运行npm installwebpack

  3. 所以在setup.py

    setup(
        name='myapp',
        ...
        cmdclass={'sdist': MySdistCommand}
        ...)
    

    然后MySdistCommand

    from setuptools.command.sdist import sdist
    
    class MySdistCommand(sdist):
       def run(self):
           import subprocess
           subprocess.check_call(['npm', 'install'])
           subprocess.check_call(['./node_modules/.bin/webpack', '-p'])
           sdist.run(self)
    

    到目前为止似乎有效。当我们尝试将它部署到prod时(通过相当扭曲的docker + puppet系统),我会告诉你是否出现了怪癖。我不确定它在尝试运行真实时会发现自己的目录,但它在dev中有效。 :-D

答案 2 :(得分:0)

抱歉(非常晚)回答。但是我遇到了同样的问题,并用一个入口点解决了它,比如this。添加入口点允许我们添加一个脚本,该脚本将与您可能具有的webpack配置位于同一文件夹中。

因此,您可以检查入口点,是否已经发生构建,如果没有,则可以构建:)或者,如果必须在运行setup.py时构建,则可以包含两个函数在您的入口点,只需在setup.py install develop步骤中运行设置功能,然后使用自定义构建步骤执行npm install或类似的操作。

您需要的主要部分是:

entry_points={
    "console_scripts": [
        "mywebpack=script_build:main",
    ]
},

我的脚本看起来像

from os.path import exists, dirname, join
from subprocess import Popen
import sys


def main():

    # Find the path of the script
    path = dirname(__file__)

    # Get the arguments that should pass to webpack
    args = sys.argv[1:]

    # Call webpack with the arguments passed to this program
    webpack_invocation = join(path, 'node_modules', '.bin', 'webpack')
    webpack_command = [webpack_invocation] + args
    process = Popen(webpack_invocation, cwd=path, shell=True)
    process.wait()


if __name__ == "__main__":
    main()

然后您可以在控制台中使用

mywebpack <options>

这将保证它使用本地安装的webpack版本:) 希望有所帮助!