Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';使用生成步骤打包web应用程序的python方法是什么?_Python_Node.js_Reactjs_Setuptools_Webpack - Fatal编程技术网

什么';使用生成步骤打包web应用程序的python方法是什么?

什么';使用生成步骤打包web应用程序的python方法是什么?,python,node.js,reactjs,setuptools,webpack,Python,Node.js,Reactjs,Setuptools,Webpack,我有一个基于Python的web应用程序,我正在尝试将其打包为setuptools包,以便可以使用pip和/或Python setup.py xxxxx安装它。此web应用程序还包含React前端的静态文件。我使用webpack(因此node.js)为网站生成JavaScript包。我正试图找出包装这件事的最适合的方法。通过谷歌搜索,我发现这似乎是相关的 理想情况下,我希望此软件包具有以下特点: 与pip install或python setup.py install一起安装时,不应安装nod

我有一个基于Python的web应用程序,我正在尝试将其打包为setuptools包,以便可以使用
pip
和/或
Python setup.py xxxxx
安装它。此web应用程序还包含React前端的静态文件。我使用webpack(因此node.js)为网站生成JavaScript包。我正试图找出包装这件事的最适合的方法。通过谷歌搜索,我发现这似乎是相关的

理想情况下,我希望此软件包具有以下特点:

  • pip install
    python setup.py install
    一起安装时,不应安装
    node
    webpack
    ,但安装的软件包应包含webpack输出

  • webpack
    生成的输出不需要签入源repo。(即,需要在包装过程中的某个时间点生成。)

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

  • 如果这很简单,那么当virtualenv被激活时,如果
    webpack
    可以在“观看”模式下启动,当它被停用时停止(但这完全是一个扩展目标),这也会很酷

考虑到这些需求,我的直觉是我需要对
sdist
命令进行子类化,以便在源发行版生成时生成网页包输出。我还猜测我需要对
develope
命令进行子类化,以注入仅用于开发的需求


好像这是一座桥,以前一定有人穿过过。有人有什么建议吗?

我认为您最好将这些关注点分成不同的构建步骤,如果我们稍微分离一下您的流程,这些步骤就会出现(假设
节点
npm
虚拟机
已经安装在您的设备上)

  • 在本地virtualenv中安装所需的python模块
  • 安装运行webpack脚本所需的webpack和npm模块
  • 运行webpack配置,以便在本地编译静态资产
  • 这些步骤中的每一步都表示一个命令,该命令可以最终生成一个Makefile,或者只是一个简单的shell脚本(如果您想继续使用python,也可以使用),因此您可以使用以下命令:

    • python要求
    • 节点要求
    • buildstatic
    • 构建
      ->
      python需求
      节点需求
      构建静态

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

    我们不是相同的部署系统,但寻求的是相同的东西:不需要在生产中使用节点,而是使用webpack构建以进行最终部署。我们正在使用docker运行一个临时构建机器

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

  • 因此,我将其留给docker的配置来确保通过添加
    curl…&&apt获取
    等到
    Dockerfile

  • 我对
    sdist
    进行了子类化,并修改了
    run
    命令,以便在命令行上运行
    npm install
    webpack

  • 因此在
    setup.py中

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

    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

    很抱歉(非常晚)给出了答案。但我遇到了同样的问题,并通过一个入口点解决了它,比如。添加入口点允许我们添加一个脚本,该脚本将与您可能拥有的网页配置位于同一文件夹中

    因此,您只需在入口点中检查是否已发生生成,如果未发生则进行生成:)或者,如果必须在运行
    setup.py
    时进行生成,则可以在入口点中包含两个函数,只需在
    setup.py安装开发
    步骤上运行安装功能,然后使用自定义构建步骤执行
    npm安装
    或类似操作

    您需要的主要部分是:

    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>
    
    mywebpack
    
    这将保证它使用本地安装的webpack:)
    希望有帮助

    我试图取代的解决方案就是这种东西。我真的希望我能在一个单位里把它全部抓获。自从问起,我实际上已经让它按照我的问题中所描述的那样工作了(子类化
    install
    sdist
    develope
    ),但我想看看是否有任何现有的指导没有通过我的谷歌搜索<代码>distutils
    setuptools
    具有很大的灵活性(同时也有很多漏洞),通常很难知道您是否以“正确”的方式进行操作。真正正确地打包python应用程序是非常棘手的,virtualenv中的
    --relocate
    标志有缺陷,被认为是不推荐的。看看