如何在Python软件包的distutils安装的构建阶段编译CoffeeScript?

6
我正在开发一个Python Django软件包,其前端组件使用了一些CoffeeScript。
目前,我有一个相当简单的外部脚本来处理CoffeeScript编译。它只是运行src/coffee/目录中每个*.coffee文件的coffee编译命令,并将输出存储在src/static/js中 - 这类似于python ./setup.py build_ext --inplace将C扩展的构建文件存储在开发源树中。
这现在起作用了,但是很低劣-它强制执行平面目录结构,而且修改了src/static中的文件(这与“static”相反)。
我想要最大限度地使用Python,因此我研究了修改distutils.ccompiler.CCompiler以将coffee作为setup.py“build_ext”子命令的子命令的能力-我设想能够执行以下操作:
% python ./setup.py build_coffee
% python ./setup.py build_coffee --inplace
% python ./setup.py build_ext --inplace # implying 'build_coffee --inplace'

...但我发现distutils的编译器API过于专注于C编译细节,而这种情况在此案例中没有类似物,例如预处理、链接等。我还查看了Cython的代码(特别是Cython的CCompiler子类,该子类将.pyx文件预处理为.c源文件),但这看起来同样是专门针对某些情况而设计的,不太适合这种情况。

有人有好的解决方案可以使用distutils setup.py脚本编译CoffeeScript吗?或者,如果没有,有什么好的替代建议吗?


1
请查看 https://github.com/jezdez/django_compressor,不确定是否符合您的需求。 - Vincent Briglia
我实际上正在我的基础项目中使用该软件包,同时我正在开发一个使用它的Web应用程序。这是一个很棒的软件包,但它的重点是在Web环境中自动部署已编译/压缩的资源 - 我不能将其用作通用先决条件。我正在寻找更像Cython与distutils一起工作的东西(例如,如果您已安装它,它将根据需要进行预处理和编译)。我的潜在用户可能没有以同样的方式安装CoffeeScript,并且他们的Web应用程序部署方法可能与django-compressor不兼容。 - fish2000
绑定到Django的collectstatic命令有什么问题? - George Marshall
这个问题并没有什么大问题。只是在Python软件包的distutils安装的构建阶段中无法编译CoffeeScript(这正是我想要实现的)。 - fish2000
3个回答

2
你可以设置一个pre-commit hook,将Coffeescript编译成Javascript。
这样,每次你提交Coffeescript的更改时,Javascript版本都会被更新。
*预提交挂钩:如何设置取决于您使用的版本控制系统,并且需要您使用一个合理的版本控制系统。

实际上,我喜欢预提交钩子 - 我主要使用git;在这方面,它并不那么疯狂 - 实际上,我现在正在使用预提交钩子调用我的芝士编译批处理脚本。对于我的开发需求以及可能从GitHub克隆它的耐心和感兴趣的人来说,这一切都很好,但是将“构建系统”与我选择的VCS集成在CheeseShop源代码tarball(或egg,天哪)之类的东西中是行不通的。这就是为什么在这种情况下我正在寻找一个distutils友好的解决方案。 - fish2000
1
好的,既然你鼓励我,我会快速尝试说服你哈哈哈……你希望构建系统不依赖于版本控制系统,以便用户可以在不需要版本控制系统的情况下对模块进行编码和构建。然而,由于你正在使用git,一个用户能否直接修改你的模块而不进行git fork,并且因此失去commit-hook的功能?这样做是否会鼓励一种不好的实践呢?此外,用户需要安装coffescript编译器才能使用他的修改来构建你的模块,这意味着他应该足够有能力使用git fork和hooks。这只是一个快速的尝试,选择权在你手中。 - jpic
哈哈哈——关于最佳实践的事情是:你必须要去实践它们。因为通常,最佳实践有益于程序员所在的更大生态系统。Distutils就是一个例子:它是为最终用户的利益而设计的,我们都喜欢抱怨它;但是到了一天的尽头,用pip install something来安装东西是被Python神圣认可的方式——当我在安装别人的包时,我更喜欢这种方式,而不是去处理一堆神秘代码的分支。这个级别的用户可能非常能干,但如果我测试他们的能力,他们就会不愿意使用我的东西。 - fish2000

2
你可以将此内容整合成一个自定义的 manage.py 命令。 在这里查看 Django 官方文档 这样,每次服务器运行时都会运行该脚本,始终保持你的JS代码的干净构建。

好的决定——既然你提到了,从多个方面来看,这是一个更健康的地方。谢谢和干杯。 - fish2000

0
也许可以看一下 DukPy... 它是一个简单的 Python 的 JavaScript 解释器,可以编译 CoffeeScriptTypeScriptBabelJSJSX。使用非常简单,只需像这样导入和编译:
import dukpy
dukpy.coffee_compile("CoffeeScript goes here!")

注意: DukPy 是 Python-CoffeeScript 包的继承者,该包已不再维护。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接