【问题标题】:NPM Link: get path where package is installedNPM Link:获取安装包的路径
【发布时间】:2021-02-24 14:33:13
【问题描述】:

我尝试构建我的第一个 npm 包,但现在卡住了。

我想从我的包中加载一个位于我的测试项目根目录中的配置文件

我使用“npm link my-package”来安装它的语言环境以进行测试(如果这很重要)

这是我的文件夹结构

- my-package 
- test-project
  - node-modules 
    - my-package (npm link)
  - config.json

这个包是一个 vuejs 应用,应该启动一个服务器并提供一个页面

我从我的测试项目运行这个脚本

"scripts": {
  "generatePage": "npm explore my-package -- npm run serve"
},

我的包中的脚本

"scripts": {
  "serve": "node readFile.js & vue-cli-service serve"
},

我的包/readFile.js

file_path = path.join(process.cwd(), 'config.json')
console.log('file_path', file_path)

如果我正在运行我的脚本,我会得到这条路径/Users/name/work/my-package/config.json,但我需要/Users/name/work/test-project/config.json

如何获得正确的路径?

【问题讨论】:

  • 您是否正在寻找您的软件包的用户来提供配置?或者你的包中有你想要读取的配置文件吗?如果是后者,您很可能需要将您的 config.json 添加到您的 package.json 文件列表中。
  • 用户必须在自己的项目中创建这个config.json,这样包才能读取到。下一步是在安装过程中自动创建这个 config.json,并举例说明结构应该是什么样子。
  • 明白。 stackoverflow 来救援...查看stackoverflow.com/a/7352912/7102037 - 它似乎正是您正在寻找的。如果不是,请在此处回复,以便您的问题可以继续得到答案。
  • 不,它没有解决我的问题。我也发现了一些错误。现在我直接从 package -> scripts 调用 readFile。我已经更新了我的问题。

标签: node.js npm-link


【解决方案1】:

当您编写一个将被另一个代码库使用的库时,您无法确定 NPM 或 yarn(或您选择的任何包管理器)将安装您的库的确切位置。它可能直接在node_modules 中,但可能会根据用例嵌套。但是,正如stackoverflow 的答案here 所示,process.main.filename 变量将告诉我们调用我们的主进程的确切位置。我们可以使用这个值来确定你要读取的配置文件在哪里。

下面是一些示例代码:

config-lib 库读取配置。

index.js文件:

const fs = require("fs");
const path = require("path");
const promisify = require("util").promisify;

const readFilep = promisify(fs.readFile);

module.exports = async function loadConfig(filename = "config.json") {
  const configPath = path.resolve(
    path.dirname(require.main.filename),
    filename
  );
  console.log("(load-config lib) Config Path: " + configPath);
  try {
    const data = await readFilep(configPath, "utf8");
    return JSON.parse(data);
  } catch (err) {
    console.log(err);
  }
};

这个库有一个简单的package.json

{
  "name": "config-lib",
  "version": "1.0.0",
  "description": "I read a config",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Some Cool Guy <somecoolguy@example.com>",
  "license": "MIT"
}

现在项目本身需要这个库。这里是项目package.json

{
  "name": "project",
  "version": "1.0.0",
  "description": "I am the project",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Some Other Cool Guy <someoneelse@example.com>",
  "license": "MIT",
  "dependencies": {
    "config-lib": "file:../lib"
  }
}

(此示例中的 config-lib 库是从本地文件夹加载的。)

config-lib 库要求我在我的项目中创建一个名为 config.json 的配置文件(顺便说一句……将其命名为更具体到您的库的名称,以免与本地项目配置发生冲突(如果有的话) )。

这是一个例子config.json

{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

最后,在我的项目中,我可以使用config-lib 库来读取我的配置文件:

const configLib = require("config-lib");

(async () => {
  console.log("Reading config");
  const data = await configLib();

  console.log("Here is my config: " + JSON.stringify(data));
  console.log("key1 value: " + data.key1);
})();

【讨论】:

  • 嗯,现在我得到了这条路径:/Users/name/work/my-package/node_modules/@vue/cli-service/bin/config.json。而且我不需要“test-project”中的 config.json,它只会被“my-package”用于生成带有设计令牌的页面,开发人员始终可以使用它们。对不起,我是一名 UI 设计师,有一些小的编码技能;)
  • 老实说,我从来没有使用npm link 进行测试,我一直只是使用基于文件的安装来测试我的库。这可能是问题所在。尝试使用文件安装来安装您的软件包。例如,对于上面的测试代码,我有一个根测试文件夹/user/guy/testing,然后我有一个用于库的lib 文件夹和一个用于项目的project 文件夹。在项目文件夹中,我执行了npm install ../lib 来安装我的库。试试看。
  • 没有npm i ../my-package我得到相同的路径。但是,如果我在已安装的包中编辑某些内容并将其保存,“原始”包也会得到更新,这是否正常?也许问题是我如何用npm explore my-package -- npm run serve 调用包?
  • 首先,我在我的 lib 文件夹中使用了npm link(来自示例代码),然后使用了npm link config-lib,一切都按预期工作。其次,如果您运行npm explore my-package -- npm run serve,它将从您的包中运行node 进程,这就是您找到您正在寻找的路径的原因。您需要在应用程序端拥有npm run serve 才能找到应用程序配置。试试我的代码,从配置的角度来看,你会看到你想要做什么。
  • 首先感谢您的宝贵时间。但我需要从“my-package”运行npm run serve,这将启动 vuejs 服务器并基于 config.json 构建页面。或者有没有办法从我的应用程序中读取配置并将其传递给我的库?也许我脑子里全都错了;)
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 2018-06-05
  • 2014-11-27
  • 2019-08-12
  • 1970-01-01
相关资源
最近更新 更多