2012-05-14 9 views
10

Seguí el ejemplo del proyecto github meteorirc y los puse en/public/¿Dónde colocamos los módulos de nodos que instalamos por npm en un proyecto Meteor?

Instalé mis módulos de nodo a través de npm desde adentro/public/y por lo tanto tengo un directorio/public/node_modules /.

No creo que este es el lugar 'adecuado' o 'estándar' para ellos, porque de acuerdo a los documentos de meteoros ...

Meteor reúne todos sus archivos JavaScript, con exclusión de cualquier cosa bajo el cliente y subdirectorios públicos, y los carga en un servidor de Node.js instancia dentro de una fibra

el código para cargar se encuentra en el directorio de servidor y servidor de archivos js y se parece a esto.

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'); 
} 

Sobre la base de los documentos esto no es estándar y no creo que debería estar haciendo de esta manera. Sin embargo, funciona tanto en mi plataforma de desarrollo como en producción en deploy meteor.com.

¿En qué parte de la estructura de directorios del proyecto deberían instalarse los módulos de nodos para que funcionen localmente y luego de la implementación en meteor.com o en otro lugar?

Respuesta

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

Tenga en cuenta que los módulos de nodo no se implementarán si se está implementando en meteor.com a través de la función de implementación si usa esta solución. Esta solución es buena para el desarrollo local o la instalación de módulos de nodo en su propia implementación Meteor como AWS o algo así. Si se está utilizando para el uso de meteor.com (esta solución). [Http://stackoverflow.com/questions/10476170/how-can-i-deploy-node-modules-in-a-meteor-app-on-meteor -com] –

+0

Se ha publicado una pregunta de seguimiento sobre/usr/local vs/usr/lib: [Debo instalar módulos npm para Meteor en/usr/lib o /usr/local?](http://stackoverflow.com/q/14304639/16308) – Rahul

+1

Esto no funcionó en MacOS X 10.9.1 y el último meteoro (0.7.0.1) .. todavía no puedo encontrar el módulo SOAP independientemente de dónde lo instale. Intenté el directorio de la aplicación (causó errores), intenté lo anterior, y también intenté instalar el módulo con -g ... todo fue en vano. – redcap3000

1

Meteor toma lib/node_modules del paquete de desarrollo y crea un enlace simbólico o lo copia en server/node_modules, que se encuentra en la subcarpeta oculta .meteor de su proyecto.

lo tanto, si el CD en el directorio lib del paquete de desarrollo o en server directorio de la carpeta .meteor (creo que es en build); usted podrá usar los módulos de nodo. Si tiene problemas para cargarlos, es posible que desee comprobar this question.

+0

Sí que es mi enlace de hilo. Mi preocupación es que si los pones en/public/node_modules/puedes atravesar la estructura del directorio desde un navegador web. Lo que conduce a problemas de seguridad. Cuando instalé módulos de nodo a través de npm en el área/server/node_modules, no se implementan. –

1

hay que añadir paquete carpeta a la ruta:

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

Aquí es mi muestra de trabajo en CoffeeScript, node_modules están en pública carpeta:

# 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') 

¡Buena suerte!

+0

Nota: desde Meteor 0.6.0, '__meteor_bootstrap __. Require' ha sido obsoleto por [Npm.require()] (http://stackoverflow.com/a/15351543/1269037) –

0

¡Esto me ayudó mucho incluyendo un paquete de resaltado de sintaxis! ¡Gracias!

uso un poco de ayuda, aunque, como creo que esto no será el último paquete de NPM Voy a usar;)

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 

utilizar de esta manera:

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

* Nota *: desde Meteor 0.6.0 , '__meteor_bootstrap __. require' ha sido obsoleto por [Npm.require()] (http://stackoverflow.com/a/15351543/1269037) –

0

estoy usando such script que instala muy bien todas las dependencias node.js. Se comporta de forma similar al soporte oficial en la rama del motor Meteor (instala dependencias en el tiempo de ejecución) pero también admite la instalación desde repositorios git y artículos similares.

2

utilizar módulos de NPM en Meteor su añadiendo el módulo de NPM en.

En primer lugar es necesario agregar un adaptador paquete de NPM como meteorhacks:npm

meteor add meteorhacks:npm 

continuación, iniciar su aplicación meteoro ejecutando meteor, se se dará cuenta de un nuevo archivo packages.json en su proyecto

Agregar a módulos de este tipo (es necesario definir explícitamente una versión)

{ 
    "request" : "2.53.0" 
} 

continuación, puede utilizar los módulos de la NGP en su aplicación de meteoritos, utilice Meteor.npmRequire en lugar de require

var request = Meteor.npmRequire("request") 
Cuestiones relacionadas