2012-05-15 106 views
4

我正在研究一个Python Django包,其前端组件使用了一点CoffeeScript。如何在Python包distutils安装的构建阶段编译CoffeeScript?

现在,我有一个非常大脑死亡的外部脚本来照顾CoffeeScript编译。它仅对src/coffee /目录中的每个* .coffee文件运行coffee编译命令,并将输出存储在src/static/js中 - 这与python ./setup.py build_ext --inplace在开发源代码树中如何存储C扩展的构建文件类似。

现在可以使用,但它很俗气 - 它强制使用一个扁平的目录结构,并修改src/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,不知道这是否适合您的需求 –

+0

我实际上是在我的基础项目中使用该软件包,在该项目中我正在开发此软件包以及一个Web应用程序使用它。这是一个很好的软件包,但重点在于在Web上下文中自动部署编译/压缩资产 - 我不能将其用作通用先决条件。我正在寻找更多的内容,比如Cython如何使用distutils(例如,如果安装了它,它将根据需要进行预处理和编译)。我的潜在用户可能没有以相同方式安装CoffeeScript,并且他们的webapp部署方法可能与django-compressor不兼容。 – fish2000

+0

绑定到Django的collectstatic命令有什么不对吗? –

回答

1

您可以将其转换为自定义的manage.py命令。 See the official Django documentation here这种方式脚本将在每次运行服务器时运行,始终导致js的干净构建。

+0

良好的呼叫 - 现在你提到它,这是一个健康的地方在这种类型的事情在很多方面。感谢和salud。 – fish2000

1

你可以有一个pre-commit hook *将coffescript编译成javascript。

因此,每次在coffescript中提交更改时,都会更新javascript版本。

* pre commit hook:执行此操作的方式取决于您使用的VCS,并取决于您是否使用了理智的VCS。

+0

其实我喜欢pre-hook钩子 - 我主要使用git;在这方面,它不是那么坚果 - 事实上,我现在正在用预先提交的钩子调用我的俗气的编译批处理脚本。这对我的开发需求来说很好,也许对于那些将它从GitHub中克隆出来的病人和感兴趣的人,但是将“构建系统”与我选择的VCS集成在一起,不会像CheeseShop源tarball(或者一个蛋,godforbid)。这就是为什么我在这种情况下寻找一个distutils友好的解决方案。 – fish2000

+1

好吧,既然你鼓励我,我会尽快说服你哈哈哈....您希望构建系统不依赖于VCS,这样用户就可以在不需要VCS的情况下破解并构建模块。既然你使用的是git,那么对于一个用户来说,如果不使用git fork来攻击你的模块,从而提交钩子的能力真的有意义吗?这不是鼓励一种不好的做法吗?另外,用户需要安装一个coffescript编译器来修改你的模块,这意味着他应该足够胜任使用git fork和hooks。只是一个快速的尝试,选择是你的 – jpic

+0

哈哈哈 - 关于实践的事情是:你必须练习它们。 Cuz通常是最好的实践,可以让更大的生态系统_qua_程序员受益。 Distutils就是一个例子:它是为了最终用户的利益,我们都喜欢讨厌它;但是在一天结束时,安装Pythonic的方式是使用'pip install something'来安装 - 作为最终用户,我更喜欢在安装某人elses的软件包时与使用fork充满神秘的代码。这个级别的用户可能相当有能力,但如果我测试他们的能力,他们会不愿意使用我的东西。 – fish2000