簡體   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