我有一个基于Python的网络应用,我试图将其打包为 setuptools 包,以便可以使用Router.configure({
trackPageView: true
});
和/或pip
进行安装。此Web应用程序还包含React前端的静态文件。我使用 webpack (因此 node.js )为网站生成JavaScript包。我正在试图找出最经典的方法来打包它。通过谷歌搜索,我发现nodeenv
似乎相关。
理想情况下,我希望这个包具有以下特征:
与python setup.py xxxxx
或pip install
安装时,不应安装python setup.py install
和node
,但已安装的软件包应该包含webpack输出。
webpack
生成的输出应该不需要检入源代码库。 (即需要在包装过程中的某个时刻生成。)
当通过webpack
或pip install -e
设置包以进行开发时,应该 安装python setup.py develop
和node
(I怀疑前面提到的webpack
在这方面会有用。)此时它还应该运行 nodeenv
,以便之后webpack
生成的内容存在
如果这很容易,那么当virtualenv被激活时,webpack
可以在“监视”模式下启动,并且当它被停用时停止(但是完全< / em>伸展目标。)
根据这些要求,我的预感是,我需要继承webpack
命令,以便在源代码分发生成时生成webpack输出。我也猜测我需要继承sdist
命令来注入仅限开发的需求。
这似乎是一个人必须穿过的桥梁。任何人有任何指针?
答案 0 :(得分:0)
我认为您最好将这些问题分解为不同的构建步骤,如果我们稍微讨论您的流程,会出现这些步骤(假设node
,npm
和{{ 1}}已安装在你的盒子上)
这些步骤中的每一步都代表一个命令,最终可以在 Makefile 中结束,或者只是一个简单的shell脚本(如果你想坚持使用python,则使用Fabric)所以你最终会得到以下命令:
virtualenv
python-requirements
node-requirements
build-static
- &gt; build
,python-requirements
,node-requirements
现在您可以随意运行这些命令!如果您正在部署,则会运行build-static
,例如,它会连续运行每个步骤。
答案 1 :(得分:0)
我们不是相同的部署系统,但寻求同样的事情:不需要生产节点,而是使用webpack构建最终部署。我们正在使用docker来运行临时构建机器......
构建器安装它需要的所有分发包,然后检出代码,调用setup.py
来构建自己,运行无数测试,最后将构建目录部署到prod。
因此,我已将其留待Docker的配置,以确保nodejs
和npm
通过添加curl... && apt-get
等安装到Dockerfile
。
我已经将sdist
子类化,并修改了run
命令,以便在命令行运行时运行npm install
和webpack
。
所以在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版本:) 希望有所帮助!