繁体   English   中英

package.json 中的本地依赖

[英]Local dependency in package.json

我想做这样的事情,所以npm install还会安装package.json../somelocallib或更重要的是它的依赖项。

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

npm >= 2.0.0

这个特性是在 npm 2.0.0 版本中实现的。 例子:

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

以下任何路径也有效:

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

本地包将被复制前缀./node-modules )。

npm < 2.0.0

somelocallib一样将somelocallib作为依赖项放在package.json中:

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

然后运行npm link ../somelocallib ,npm 将安装您正在使用的版本作为 symlink

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

参考:链接(1)

现在可以直接在package.json指定本地 Node 模块安装路径。 从文档:

本地路径

从版本 2.0.0 开始,您可以提供包含包的本地目录的路径。 可以使用npm install -Snpm install --save保存本地路径,使用以下任何形式:

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

在这种情况下,它们将被规范化为相对路径并添加到您的package.json 例如:

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

此功能有助于本地离线开发和创建需要在不想访问外部服务器的地方安装 npm 的测试,但不应在将包发布到公共注册表时使用。

这对我有用。

将以下内容放入您的 package.json 文件中

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}

如果您想进一步自动化此操作,因为您正在将模块检查到版本控制中,并且不想依赖于记住 npm 链接的开发人员,您可以将其添加到您的 package.json “脚本”部分:

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

这感觉超出了hacky,但它似乎“有效”。 从这个 npm 问题中得到提示: https : //github.com/npm/npm/issues/1558#issuecomment-12444454

这是添加本地依赖项的方式:

npm install file:src/assets/js/FILE_NAME

从 NPM 将其添加到 package.json 中:

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

像这样直接添加到 package.json 中:

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

主项目

这是您将用于主项目的 package.json:

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

在那里, ./somelocallib相对于主项目 package.json对库文件夹的引用。

参考: https : //docs.npmjs.com/cli/v7/configuring-npm/package-json#local-paths


子项目

处理您的库依赖项。

除了运行npm install ,您还需要运行(cd node_modules/somelocallib && npm install)

这是 NPM 的一个已知错误。

参考: https : //github.com/npm/npm/issues/1341 (寻求更新的参考)


Docker 的注意事项

将您的主package.locksomelocallib/package.lock入源代码管理器。

然后在您的 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)
# ...

我在(cd A && B)构造中使用括号来使操作具有幂等性。

完整本地开发的两个步骤:

  1. 提供包含包的本地目录的路径。
 { "name": "baz", "dependencies": { "bar": "file:../foo/bar" } }
  1. 符号链接包文件夹

    cd ~/projects/node-redis # go into the package directory npm link # creates global link cd ~/projects/node-bloggy # go into some other package directory. npm link redis # link-install the package

在 2020 年,我在 Windows 10 上工作,我尝试使用

"dependencies": {
    "some-local-lib": "file:../../folderY/some-local-lib" 
    ...
}

然后进行npm安装。 结果是在node-modules创建了文件夹的快捷方式。 这不起作用。 您需要一个硬链接 - Windows 支持,但您必须在 Windows 中做一些额外的事情来创建一个硬符号链接。

由于我真的不想要硬链接,因此我尝试使用 url:

"dependencies": {
    "some-local-lib": "file:///D:\\folderX\\folderY\\some-local-lib.tar" 
     ....
}

这很好用。
tar(您必须对库的 build / dist 文件夹中的内容进行 tar)提取到节点模块中的真实文件夹中,您可以像其他所有内容一样导入。
显然 tar 部分有点烦人,但由于 'some-local-lib' 是一个库(无论如何都必须构建),我更喜欢这个解决方案来创建硬链接或安装本地 npm。

我知道npm install ../somelocallib可以工作。

但是,我不知道您在问题中显示的语法是否适用于package.json ...

不幸的是, doc似乎只提到 URL 作为依赖项。

尝试file:///.../...tar.gz ,指向一个压缩的本地库...并告诉我们它是否有效。

好奇.....至少在 Windows 上(我的 npm 是 3.something)我需要做:

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

当我执行npm install ../module1 --save它会根据文档生成绝对路径而不是相对路径。

我又搞砸了一点,并确定../xxx就足够了。

具体来说,我已检出本地节点模块以表示 d:\\build\\module1、d:\\build\\module2 和 d:\\build\\nodeApp 中的我的节点项目(应用程序)。

要“安装”,我:

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

module1 的 package.json 依赖于 "module2": "../module2"; module2 没有本地依赖; nodeApp 具有依赖项“module1”:“../module1”和“module2”:“../module2”。

不确定这是否仅适用于我,因为所有 3 个文件夹(module1、module2 和 nodeApp)都位于同一级别......

这对我有用:首先,确保 npm 目录具有正确的用户

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

然后你在你的 package.json 链接目录

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}

实际上,从 npm 2.0 开始,现在支持本地路径(请参阅 此处)。

有很棒的yalc可以帮助管理本地包。 它帮助我使用了我后来部署的本地库。 只需使用 .yalc 目录打包项目(带或不带 /node_modules)。 所以只需这样做:

npm install -g yalc  

in directory lib/$ yalc publish 

在项目中:

project/$ yalc add lib

project/$ npm install 

而已。

当您想更新内容时:

lib/$ yalc push   //this will updated all projects that use your "lib"

project/$ npm install 

使用 Docker 打包和部署

tar -czvf <compresedFile> <directories and files...>
tar -czvf app.tar .yalc/ build/ src/ package.json package-lock.json

注意:记得添加.yalc目录。

在Docker中:

FROM node:lts-alpine3.9

ADD app.tar /app

WORKDIR /app
RUN npm install

CMD [ "node", "src/index.js" ]

用纱线它可以做到

yarn add file:../somelocallib

我想使用一组用 TypeScript 编写的本地依赖项,但这里的所有答案都不适合我。 npm install只会拒绝构建依赖项。

我不得不求助于使用tsconfig.json将包添加到我的项目中,而不将它们标记为依赖项。 我用例是由事实进一步复杂化,一些依赖互相依赖的,我想他们来自本地文件夹。

这是我的解决方案:

// tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@tiptap/*": [
        "tiptap/packages/*/src"
      ]
    }
  }
}

在上面的例子中,我有一个名为tiptap/的本地项目子文件夹,并且在tiptap/packages/*有很多包。 "paths"选项会将所有@tiptap/foo导入重写到./tiptap/packages/foo/src ,包括我自己的文件和tiptap/的文件。

这不是一个好的解决方案,但它是唯一对我有用的方法。

在 2021 年,您需要像这样使用它:

npm i my-pkg@file:./path-to-my-pkg.js

如果它的文件或路径到文件夹,如果它是带有package.json完整包,则最后使用.js

用法

const myPkg = require('my-pkg')

这就像魅力一样!

完整的纱线用户本地开发指南:

首先将依赖项添加到您的主项目:

cd main-project
yarn add file:../path/to/your-library

接下来,如果您想避免每次更改它的源时都重新构建此依赖项:

cd your-library
yarn link

这将注册一个指向您的图书馆的链接。 接下来,使用您刚刚在主项目中创建的链接。

cd main-project
yarn link your-library

现在每次你在你的库中更改代码时,你不需要重建它,它会自动包含在你的主项目中。 纱线链接通过在您的 node_modules 文件夹中创建符号链接来工作,请在此处阅读更多相关信息: https://classic.yarnpkg.com/lang/en/docs/cli/link/

使用工作区

使用file:../path/to/your-library的缺点是您必须npm install或使用npm link才能使更改在导入您的 package 的包中生效。

如果您使用 pnpm: 更好的解决方案是使用workspace: protocol : workspace:../path/to/your-library 它会将目录符号链接到您的 node_modules 而不是复制它,因此源代码中的任何更改都会立即生效。

例如:

  ...
  "dependencies": {
    ...
    "my-package": "workspace:../../dist"
  },

注意:此解决方案旨在用于工作区,因此您可能需要在项目的根目录中创建pnpm-workspace.yaml (即使是空文件)文件。

使用模块别名

  1. 安装模块别名 package:

    npm i --save module-alias

  2. 像这样将路径添加到您的 package.json:

    { "_moduleAliases": { "@lib": "app/lib", "@models": "app/models" } }

  3. 在您的入口点文件中,在任何 require() 调用之前:

    require('module-alias/register')

  4. 您现在可以要求这样的文件:

    const Article = require('@models/article');

file:直接链接本地文件夹为package。如果本地文件夹包含devDependencies ,则会导致版本冲突。

link:也将本地文件夹链接为 package,但也忽略链接的 devDepedencies,其行为与从 NPM 使用的 package 完全相同,但在本地。

TLDR:使用link来避免devDependency冲突:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM