package.json中的本地依赖项

我想这样做,所以npm install也安装../somelocallibpackage.json,或者更重要的是它的依赖项。

"dependencies": {
"express": "*",
"../somelocallib": "*"
}
592416 次浏览

NPM >= 2.0.0

这个特性是npm 2.0.0版本中的实现。本地路径可以使用npm install -Snpm install --save保存,使用以下任何一种形式:

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

例# EYZ0:

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

# EYZ0:

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

npm & lt;2.0.0

somelocallib作为依赖项放在package.json中。

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

然后运行npm link ../somelocallib, npm将安装你正在使用的版本作为符号链接

参考:# EYZ0

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

然而,我不知道你在问题中显示的语法是否从package.json开始工作…

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

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

如果你想进一步自动化这个,因为你正在将你的模块检入版本控制,并且不想依赖于开发人员记住npm link,你可以将这个添加到你的包中。Json“脚本”部分:

"scripts": {
"postinstall": "npm link ../somelocallib",
"postupdate": "npm link ../somelocallib"
}
这感觉很俗气,但似乎很“管用”。从这个npm问题中得到了提示: # EYZ0 < / p >

这对我来说很有效:首先,确保npm目录有正确的用户

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

那你就在你的包裹里。Json链接目录

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

这对我很有用。

将以下内容放入包中。json文件

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

实际上,从npm 2.0开始,现在支持本地路径(参见在这里)。

好奇……至少在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的包。Json有一个依赖项"module2": "../module2";Module2没有本地依赖;nodeApp有依赖"module1": ".."../ module1"和"module2": "../module2"。

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

这是如何添加本地依赖项的:

# EYZ0

把它添加到包中。json来自NPM:

# EYZ0

直接添加到包。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"
....

主项目

这是包裹。Json,你将用于主项目:

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

其中,./somelocallib是对库文件夹相对于主项目package.json的引用。

参考:# EYZ0


子工程

处理你的库依赖项。

除了运行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)结构中使用了圆括号,使操作是幂等的。

在2020年的这里,我正在用Windows 10操作系统工作

"dependencies": {
"some-local-lib": "file:../../folderY/some-local-lib"
...
}
然后执行npm安装。结果是在node-modules中创建了文件夹的快捷方式。 这行不通。你需要一个硬链接-哪个窗口支持,但是 你必须在Windows中做一些额外的事情来创建一个硬符号链接

因为我不是真的想要一个硬链接,我尝试使用一个url代替:

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

这工作得很好。
tar(你必须tar库的build / dist文件夹中的东西)被提取到node-modules中的一个真正的文件夹中,你可以像其他东西一样导入。
显然tar部分有点烦人,但由于'some-local-lib'是一个库(无论如何都要构建),我更喜欢这个解决方案,而不是创建一个硬链接或安装一个本地npm

有一个很棒的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目录。

inDocker:

FROM node:lts-alpine3.9


ADD app.tar /app


WORKDIR /app
RUN npm install


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

用纱线可以这样做

# EYZ0

我想使用一组用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


# To remove it later
npm un my-pkg

如果它的文件或路径到包含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

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