Dependência local em package.json

453

Eu quero fazer algo como isso, então npm installtambém instala o package.jsonde ../somelocallibou mais importante suas dependências.

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}
user1680104
fonte

Respostas:

582

npm> = 2.0.0

Esse recurso foi implementado na versão 2.0.0 do npm. Exemplo:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Qualquer um dos seguintes caminhos também é válido:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

O pacote local será copiado para o prefixo ( ./node-modules).

npm <2.0.0

Coloque somelocallibcomo dependência no seu package.jsonnormal:

"dependencies": {
  "somelocallib": "0.0.x"
}

Em seguida, execute o npm link ../somelocallibnpm e instalará a versão na qual você está trabalhando como um link simbólico .

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

Referência: link (1)

danilopopeye
fonte
3
Como podemos desvincular isso?
AtaurRehman Asad
13
A desvantagem de instalar pacotes locais com "npm link" é que você recebe muita duplicação de módulos. Ao listar suas dependências com "module: version" ou "module: git-repo", o algoritmo de instalação do npm evita instalar um pacote que já esteja instalado em um pacote pai. Portanto, com "npm link", se o seu aplicativo principal depende de "[email protected]" e todos os seus pacotes locais também dependem de "[email protected]", você terminará com todos os pacotes locais instalando "[email protected]. 0 "em vez de usar a mesma versão" assíncrona "instalada do aplicativo principal. Isso não acontece usando a "pasta de instalação npm".
Pedro Ballesteros
3
@PedroBallesteros você pode usar o npm deduppara corrigir este problema. npmjs.org/doc/cli/npm-dedupe.html
danilopopeye
4
"O pacote local será copiado ..." não parece ser o caso de uma versão mais recente do npm. Agora, um link simbólico é criado.
tsauerwein
2
@danilopopeye Segundo a descrição de docs.npmjs.com/cli/install npm install <folder> , instale o pacote no diretório como um link simbólico no projeto atual.
Herman J. Radtke III
211

Agora é possível especificar os caminhos de instalação do módulo Nó local package.jsondiretamente. Dos documentos:

Caminhos locais

A partir da versão 2.0.0, você pode fornecer um caminho para um diretório local que contém um pacote. Os caminhos locais podem ser salvos usando npm install -Sou npm install --save, usando qualquer um destes formulários:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

nesse caso, eles serão normalizados para um caminho relativo e adicionados ao seu package.json. Por exemplo:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

Esse recurso é útil para o desenvolvimento offline local e para a criação de testes que requerem a instalação do npm onde você não deseja acessar um servidor externo, mas não deve ser usado ao publicar pacotes no registro público.

Michael Trouw
fonte
23
No npm v.3 +, a normalização é absoluta, não relativa , então você verá algo como"bar": "file:///home/user/src/foo/bar"
Ron Wertlen 8/16
27
Como atualizar a dependência do caminho local sem incrementar a versão?
precisa saber é o seguinte
3
A propósito, isso causa todos os tipos de problemas quando e / ou se você tentar encaixar o aplicativo do nó, pois as node:onbuildimagens padrão apenas copiam o diretório atual e, portanto, deixam de fora qualquer coisa ../foo.
Donmartin
4
existe alguma maneira de integrar isso ao git + ssh para que se possa ter uma cópia local do repositório git de onde eles npm installprocedem ou outro repositório git na LAN? Quando tento a instalação acima e npm do git + ssh, ele parece procurar no diretório node_modules e não tentar passar por cima do git + ssh, embora seja assim que estou instalando o pacote de nível superior.
Michael
1
Instalando trabalho. Mas dessa forma, receberei "ERR não encontrado" ao tentar importar o módulo para o meu projeto.
C4d
87

Isso funciona para mim.

Coloque o seguinte no arquivo package.json

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}
Brian McAuliffe
fonte
4
Obrigado pela sugestão que não requer o uso de "npm link"
ItalyPaleAle 4/14/14
Ele foi removido .gitignorena pasta do módulo, criado .npmignoree a primeira vez que o executei, apliquei 777 recursivamente em todas as pastas, exceto node_modules. Mas sim, instalou as dependências. Usando o npm versão 1.4.14.
L0LN1NJ4
usei isso, mas em vez de mexer com node_modules eu usei app_modules
catalint 28/11
1
Por que não "dependencies": { "my-own-module": "file:../my-own-module" }?
precisa saber é o seguinte
1
Eu concordo com @Bohdan aqui. dependências locais farão exatamente a mesma coisa. A vantagem de usar npm linké que você não precisa fazer isso npm installtoda vez para atualizar suas dependências.
Froginvasion 25/05
30

Se você deseja automatizar ainda mais isso, porque está verificando seu módulo no controle de versão e não deseja confiar nos devs lembrando-se do link npm, você pode adicioná-lo à seção "scripts" do package.json:

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

Isso parece além do hacky, mas parece "funcionar". Obtenha a dica desta edição da NPM: https://github.com/npm/npm/issues/1558#issuecomment-12444454

Taytay
fonte
15
Por que postinstalle em postupdatevez de preinstalle preupdate?
precisa saber é o seguinte
1
Você poderia explicar um pouco mais o que isso faz? ou seja, se eu configurar um projeto vscode com várias pastas raiz (ou seja, "espaço de trabalho com várias raízes"), ele poderá refletir as alterações na pasta do módulo imediatamente para os projetos que estão consumindo? - É disso que se trata esse truque?
bvdb
26

É assim que você adicionará dependências locais:

npm install file:src/assets/js/FILE_NAME

Adicione-o ao package.json do NPM:

npm install --save file:src/assets/js/FILE_NAME

Adicione diretamente ao package.json assim:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....
Sreekanth
fonte
6

Projeto mestre

Aqui está o package.json que você usará para o projeto principal:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

Aqui ./somelocallibestá a referência à pasta da biblioteca em relação ao projeto mestre package.json .

Referência: https://docs.npmjs.com/files/package.json#local-paths


Subprojeto

Manipule as dependências da sua biblioteca.

Além de executar npm install, você precisará executar (cd node_modules/somelocallib && npm install).

Este é um erro conhecido no NPM.

Referência: https://github.com/npm/npm/issues/1341 (buscando uma referência mais atualizada)


Notas para o Docker

Faça check-in no seu mestre package.locke somelocallib/package.lockno seu gerenciador de código-fonte.

Em seguida, no seu uso do Dockerfile:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

Uso parênteses em minhas (cd A && B)construções para tornar a operação idempotente.

William Entriken
fonte
3

Eu sei que npm install ../somelocallibfunciona.

No entanto, não sei se a sintaxe exibida na pergunta funcionará ou não package.json...

Infelizmente, o documento parece mencionar apenas o URL como uma dependência.

Tente file:///.../...tar.gz, apontando para uma biblioteca local compactada ... e diga-nos se funciona.

OI
fonte
1
Eu adiciono "dependências": {"somemodule": "file: ///./internal_modules/somemodule"} ao package.json. Isso não funciona. O código do erro é "npm ERR! Code E404".
Jeffrey
2

Isso funcionou para mim: primeiro, verifique se os diretórios npm têm o usuário certo

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

Então, no seu package.json, vincule o diretório

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}
Sofia
fonte
2
Links simbólicos no Windows são possíveis desde o XP en.wikipedia.org/wiki/NTFS_symbolic_link . Abra a linha de comando como administrador e execute npm install.
Sod
2

Na verdade, a partir da NPM 2.0, agora há suporte para caminhos locais (veja aqui ).

damirv
fonte
8
Michael Trouw já deu essa resposta algumas semanas antes, então por que duplicar?
Dan Dascalescu
2

Curioso ..... pelo menos no Windows (meu npm é 3. algo) que eu precisava fazer:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

Quando eu fiz um npm install ../module1 --saveresultado, resultou em caminhos absolutos e não em relação à documentação.

Eu brinquei um pouco mais e determinei que ../xxxera suficiente.

Especificamente, tenho os módulos dos nós locais verificados para dizer d: \ build \ module1, d: \ build \ module2 e meu projeto do nó (aplicativo) em d: \ build \ nodeApp.

Para 'instalar', eu:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

O package.json do módulo1 tem uma dependência de "módulo2": "../module2"; module2 não tem dependência local; O nodeApp possui dependências "module1": "../module1" e "module2": "../module2".

Não tenho certeza se isso funciona apenas para mim, pois todas as três pastas (module1, module2 e nodeApp) ficam no mesmo nível .......

Paul Duncan
fonte