2012-05-14 88 views
10

我跟着GitHub的meteorirc項目的首席,並把它們在/公/我們把npm安裝在Meteor項目中的節點模塊放在哪裏?

我安裝我的節點模塊通過NPM從內部/公共/,所以我有一個/公/ node_modules /目錄。

我不認爲這對他們來說是「適當的」或「標準」的地方,因爲根據流星文檔...

流星收集所有的JavaScript文件,但不包括 客戶端下的任何公共子目錄,並將其加載到服務器的Node.js實例 光纖

加載在服務器目錄和服務器js文件,看起來像這樣的代碼中。

var require = __meteor_bootstrap__.require; 

var path = require("path"); 
var fs = require('fs'); 
var base = path.resolve('.'); 
if (base == '/'){ 
    base = path.dirname(global.require.main.filename); 
} 

var Twit; 
var twitPath = 'node_modules/twit'; 
var publicTwitPath = path.resolve(base+'/public/'+twitPath); 
var staticTwitPath = path.resolve(base+'/static/'+twitPath); 
if (path.existsSync(publicTwitPath)){ 
    Twit = require(publicTwitPath); 
} 
else if (path.existsSync(staticTwitPath)){ 
    Twit = require(staticTwitPath); 
} 
else{ 
    console.log('WARNING Twit not loaded. Node_modules not found'); 
} 

根據文檔,這不是標準的,我不認爲我應該這樣做。然而,它可以在我的開發平臺和部署meteor.com的生產環境中使用。

如果項目的目錄結構中應安裝節點模塊,以便它們可以在本地工作,並且可以在meteor.com或其他地方部署?

回答

6
cd /usr/local/meteor/lib/ && npm install <module> 
+8

請注意,如果您使用此解決方案通過部署功能部署到meteor.com,則節點模塊將不會部署。此解決方案適用於本地開發,或者在您自己的流星部署(如AWS等)上安裝節點模塊。如果您正在部署到meteor.com使用(此解決方案)。[http://stackoverflow.com/questions/10476170/how-can-i-deploy-node-modules-in-a-meteor-app-on-meteor -com] –

+0

關於/ usr/local vs/usr/lib詢問後續問題已發佈:[我應該在/ usr/lib還是/usr/local?](http://stackoverflow.com中)安裝Meteor的npm模塊/ q/14304639/16308) – Rahul

+1

這不適用於MacOS X 10.9.1和最新的流星(0.7.0.1)..無論我在哪裏安裝,仍無法找到SOAP模塊。嘗試了應用程序目錄(導致錯誤),嘗試了上面的建議,並試圖用-g ..安裝模塊都沒有用。 – redcap3000

1

流星從開發包中取lib/node_modules並製作符號鏈接或將其複製到server/node_modules,該文件位於項目下隱藏的.meteor子文件夾中。

所以,如果你用cd命令進入lib目錄制定束或成server目錄.meteor文件夾(我相信這是在build);您將能夠使用節點模塊。如果您在加載時遇到問題,您可能需要查看this question

+0

是啊,這鏈接是我的線程。我擔心的是,如果你把它們放在/ public/node_modules /中,你實際上可以從Web瀏覽器中遍歷目錄結構。這導致安全問題。當我通過npm在/ server/node_modules區域安裝節點模塊時,它們不會被部署。 –

1

你必須文件夾添加到路徑:

var staticTwitPath = path.resolve(base+'/bundle/static/'+twitPath); 

這裏是的CoffeeScriptnode_modules我工作的樣品都在公共文件夾:

# loading node_modules from public folder 
require = __meteor_bootstrap__.require 
path = require("path") 
fs  = require('fs') 

cheerioPath = 'node_modules/cheerio' 

base = path.resolve('.') 
if base == '/' 
    base = path.dirname(global.require.main.filename) 

publicPath = path.resolve(base+'/public/'+cheerioPath) 
staticPath = path.resolve(base+'/bundle/static/'+cheerioPath) 

if path.existsSync(publicPath) 
    cheerio = require(publicPath) 
else if path.existsSync(staticPath) 
    cheerio = require(staticPath) 
else 
    console.log('node_modules not found') 

祝你好運!

+0

注意:自Meteor 0.6.0以來,'__meteor_bootstrap __。require'已被[Npm.require()](http://stackoverflow.com/a/15351543/1269037)廢棄 –

0

這幫助了我很多,包括語法高亮包!謝謝!

我用一個小幫手,雖然,因爲我認爲這不會是最後一次NPM包我會用;)

meteorNpm = do() -> 
    require = __meteor_bootstrap__.require 

    path = require 'path' 
    fs  = require 'fs' 

    base = path.resolve '.' 
    if base is '/' 
    base = path.dirname global.require.main.filename 

    meteorNpm = 
    # requires npm modules placed in `public/node_modules` 
    require: (moduleName) -> 
     modulePath = 'node_modules/' + moduleName 

     publicPath = path.resolve(base + '/public/' + modulePath) 
     staticPath = path.resolve(base + '/bundle/static/' + modulePath) 

     if path.existsSync(publicPath) 
     module = require publicPath 
     else if path.existsSync(staticPath) 
     module = require staticPath 
     else 
     module = null 

     return module 

使用方法如下:

highlight = meteorNpm.require "highlight.js" 
+1

* Note *:自Meteor 0.6.0 ,'__meteor_bootstrap __。require'已被[Npm.require()](http://stackoverflow.com/a/15351543/1269037) –

0

我使用such script它很好地安裝了所有node.js依賴項。它的行爲類似於Meteor引擎分支的官方支持(它在運行時安裝依賴關係),但它也支持從git存儲庫和類似的好東西安裝。

2

要使用NPM模塊流星其加入新公共管理模塊中。

首先,你需要添加一個NPM包適配器如meteorhacks:npm

meteor add meteorhacks:npm 

然後通過運行meteor啓動您的流星的應用程序,你將在您的項目

注意到一個新的packages.json文件添加在這樣的模塊(你需要明確定義版本)

{ 
    "request" : "2.53.0" 
} 

然後你就可以使用NPM模塊您的流星的應用程序,使用的Meteor.npmRequire代替require

var request = Meteor.npmRequire("request") 
相關問題