2012-05-15 107 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