2017-05-25 76 views
9

我正在編寫允許將數學書籍發佈爲網站的軟件。它主要基於Python + Flask,但爲了處理我使用MathJax的等式。 MathJax可以用於客戶端或服務器端(通過MathJax-node)。在後一種情況下,我必須使用npm在我的主Python腳本可以訪問的某個地方安裝MathJax-node,然後從腳本中調用它。在前一種情況下,我必須提供MathJax.js作爲資源,可供客戶使用(目前我使用Flask的send_from_directory函數)。python項目中的JavaScript依賴項

我的問題是:在Python中處理這種異構依賴關係的最佳做法是什麼?我的目標是至少在類Unix系統(Linux或MacOS)上儘可能簡化安裝過程,前提是nodenpm已經可用。

我可以將我需要的所有javascript源代碼放入我的發行版本身,但也許有更好的方法來做到這一點?

+0

softwareengineering.stackexchange.com可能更適合這個問題 – WhiteHotLoveTiger

+0

@WhiteHotLoveTiger引用其他網站時,通常會指出[交叉發佈令人不悅](https://meta.stackexchange.com/標籤/交叉發佈/信息) – gnat

+0

@gnat很高興知道。我沒有意識到這一點。在這種情況下遷移是否合適? – WhiteHotLoveTiger

回答

3

我的問題是:在Python中處理這種異構依賴關係的最佳做法是什麼?

對於節點依賴關係,我會在指定所需節點依賴關係的目錄中包含一個package.json文件。對於其他語言/包管理器,我還會使用任何指定依賴關係的常規方式(例如,爲Ruby依賴項添加Gemfile)。

另一個與Python/Flask一起出現的常見示例是使用Bower程序包管理器來實現靜態前端依賴關係。在這種情況下,依賴關係在bower.json文件中指定,通常會被拉入Flask的static目錄中的bower文件夾中。

我可以將我需要的所有javascript源文件放入我的發行版本 本身,但也許有更好的方法來做到這一點?

一旦你得到了package.json與指定的依賴關係,您可以獲取並安裝所有運行npm install這,在我看來,是一個更優雅的解決方案不是包括與該項目的JavaScript源所需要的節點的依賴。

現在,您已經有多個包管理器(例如,也許你正在使用pip在除了npm爲節點依賴Python的依賴),你可能要做出一個Makefile文件或某些部署/編譯腳本獲取/使用它們全部安裝(例如,如果我使用的是Travis CI,我會更新我的.travis.yml以呼叫npm install以及pip install -r)。

+0

謝謝!幾個問題:1.如果我使用'npm install'來安裝必要的節點包(如MathJax-node),如何才能使Python腳本知道已安裝包的位置?2.我是否確實無法處理此節點依賴項,如果我希望我的包可以安裝只有'pip install '?(即不可能從'setup.py'調用'npm install'?) –

1

使用Node.js package.json將是處理JavaScript依賴關係的最佳解決方案。至於從.py執行可執行文件,你可以參考這個答案Running shell command from Python and capturing the output。節點依賴關係默認位於與package.json文件位置相同的目錄中的./node_modules內。

對於安裝新的依賴:

npm install --save npm-package-you-want-to-install 

一旦你讓他們準備這個命令將已經安裝了你的一切:

npm install 

節點的依賴性肯定處理,因爲JavaScript的東西更優雅的方式是一個不斷髮展的世界,看看package.json比簡單地調用所述腳本的很多腳本標記/函數要容易得多。如果你想要一個自動化系統,我的建議是製作一個可執行文件(.sh),它可以運行分期付款,你可以在將來的項目中使用它。

+0

謝謝!有幾個問題:1.如果我使用'npm安裝'來安裝必要的節點包(如MathJax-node),如何才能使Python腳本知道已安裝包的位置?2.我是對的,如果我想要我的包,則無法處理此節點依賴項只能使用'pip install '來安裝(I .e。從'setup.py'調用'npm install'是不可能的?) –

+0

node_modules通常與package.json位於同一個文件夾中。因此,在package.json位於您的項目的根目錄下的情況下,node_modules也是如此。 對於py腳本(npm install),上面的註釋中有一個鏈接。 – kochai

+0

是的,我知道如何從python調用'npm install'。我要求的是以下內容。 'setup.py'基本上是'setuptools.setup'函數的一個調用,它會自動找到安裝包的正確位置。但是,我無法執行(至少不知道如何)在setuptools.setup腳本所在的目錄中執行任意的python命令(如'subprocess.run([「npm」,「install」]))' '這就是爲什麼我不明白我的Python腳本(安裝後)如何能夠意識到JavaScript依賴的位置。 –

2

我推薦使用webpack Webpack.js而不是Bowerjs。 NPM和他的package.json對於依賴更新非常有用,但是引用來自node_modules的庫有點讓人難爲情。