什么';使用生成步骤打包web应用程序的python方法是什么?
我有一个基于Python的web应用程序,我正在尝试将其打包为setuptools包,以便可以使用什么';使用生成步骤打包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
pip
和/或Python setup.py xxxxx
安装它。此web应用程序还包含React前端的静态文件。我使用webpack(因此node.js)为网站生成JavaScript包。我正试图找出包装这件事的最适合的方法。通过谷歌搜索,我发现这似乎是相关的
理想情况下,我希望此软件包具有以下特点:
- 与
或pip install
一起安装时,不应安装python setup.py install
和node
,但安装的软件包应包含webpack输出webpack
生成的输出不需要签入源repo。(即,需要在包装过程中的某个时间点生成。)webpack
- 当通过
或pip install-e
设置包进行开发时,它应该安装python setup.py develop
和node
(我怀疑前面提到的webpack
在这方面会很有用。)此时它还应该运行nodeenv
,这样之后,webpack
生成的内容存在网页包
- 如果这很简单,那么当virtualenv被激活时,如果
可以在“观看”模式下启动,当它被停用时停止(但这完全是一个扩展目标),这也会很酷webpack
sdist
命令进行子类化,以便在源发行版生成时生成网页包输出。我还猜测我需要对develope
命令进行子类化,以注入仅用于开发的需求
好像这是一座桥,以前一定有人穿过过。有人有什么建议吗?我认为您最好将这些关注点分成不同的构建步骤,如果我们稍微分离一下您的流程,这些步骤就会出现(假设
节点
,npm
和虚拟机
已经安装在您的设备上)
python要求
节点要求
buildstatic
->构建
,python需求
,节点需求
构建静态
现在您可以随意运行这些命令了!例如,如果您正在部署,您将运行
build
,它将连续运行每个步骤。我们不是相同的部署系统,但寻求的是相同的东西:不需要在生产中使用节点,而是使用webpack构建以进行最终部署。我们正在使用docker运行一个临时构建机器
构建器安装它需要的所有分发包,然后签出代码,调用setup.py
来构建自己,运行无数测试,最后将build dir部署到prod
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
标志有缺陷,被认为是不推荐的。看看