解决“npm WARN saveError ENOENT:没有这样的文件或目录,打开'/Users/<username>/package.json'”错误

65

我是一名新手,请包含URL链接或解释术语,以便我能够理解。

我已经通过终端在Mac OS(10.13.3)上安装了“npm”,并使用它安装了一些包,例如SASS。

现在,我正在尝试使用npm安装sass-mq。我认为我已经成功安装了它,但我想听听第二个意见,看看我可能做错了什么或者做得不完整。

最初,在sass-mq Github页面上遵循说明,我尝试使用:

npm install sass-mq --save

这个错误提示是:

npm WARN saveError ENOENT: no such file or directory, open '/Users/<username>/package.json'
    npm WARN enoent ENOENT: no such file or directory, open '/Users/<username>/package.json'
    npm WARN <username> No description
    npm WARN <username> No repository field.
    npm WARN <username> No README data
    npm WARN <username> No license field.

    + sass-mq@5.0.0
    updated 1 package and audited 1 package in 1.67s
    found 0 vulnerabilities

环顾四周,我意识到我应该使用

npm init

..在输入我的 'install sass-mq --save' 命令之前。

很好,完成了。下一个错误是这个:

package name: (nikhil) sass-mq
version: (1.0.0) 
description: 
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: 
license: (ISC) 
About to write to /Users/nikhil/package.json:

{
  "name": "sass-mq",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "sass-mq": "^5.0.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this OK? (yes) 
darwin:~ nikhil$ npm install sass-mq --save
npm ERR! code ENOSELF
npm ERR! Refusing to install package with name "sass-mq" under a package
**npm ERR! also called "sass-mq". Did you name your project the same
npm ERR! as the dependency you're installing?**
我认为这句话的意思是我不能将“sass-mq”(这是要安装到本地计算机上的软件包的名称)用作本地软件包的名称。更多信息请参见此处。这里有更多信息。 所以我只是简单地尝试了这个:
**package name: (sass-mq) media-queries-nikhil**
version: (1.0.0) 
description: 
git repository: 
keywords: 
author: 
license: (ISC) 
About to write to /Users/nikhil/package.json:

看起来这样做还不错。

我的问题是:我应该这样做吗?你通常是怎么做的?

此外,我得到了这些警告-忽略它们可以吗?

npm WARN media-queries-nikhil@1.0.0 No description
npm WARN media-queries-nikhil@1.0.0 No repository field.

我创建这个问题部分是为了让像我一样寻找类似问题答案的人能够找到解释,而不仅仅是需要一些命令来解决他们的问题。我找到了几个类似的问题线程,但都没有真正解释发生了什么以及原因。

感谢您的阅读,非常感谢任何帮助 :)


3
首先,您需要在特定的项目文件夹中使用npm并安装包,而不是在您的主目录中。如果您需要全局安装包以供使用,则可以运行 npm install packagename -g。您是否喜欢在当前正在工作的项目中使用npm来使用包? - muecas
我认为在这种情况下,我试图全局安装sass-mq,而不是针对特定项目进行安装,但我不知道全局安装和本地安装包之间的区别 - 谢谢! - nkhil
8个回答

57
TL;DR: 你已经做得很好,不用担心那些警告。
更深入地了解npm存在的原因和工作方式,请继续阅读。
npm代表Node Package Manager。包是node生态系统的基本组成部分-它们存在是为了让您使用其他人对常见问题的解决方案。
然而,这可能会变得非常混乱,因为这是一个开放源代码社区,它们都由不同的人在不同的时间发布。此外,您使用的两个不同包实际上可能依赖于第三个完全未知的包,{{并且可能需要不同版本的该包}}。
正如您已经看到的,这可能变得非常混乱。
npm以更易于管理和思考的方式帮助您处理这些“依赖项”,但是不使用npm也不是必须的-您可以编写一个节点应用程序,在其中自己组织所有这些不同的文件。然而,这很快就会变得非常混乱,因此在至少99%的情况下没有真正的优势。还有其他软件包管理器-我个人使用yarn,但它们都试图做类似的事情,所以选择主要是个人喜好,超出了本讨论的范围。
所以当你开始一个新项目时,输入npm init告诉npm在你的文件夹中创建一个名为package.json的文件,这将帮助你组织这些依赖项。 package.json将保存有关您自己的应用程序(它本身就是一个包)以及您告诉npm您将在自己的项目中使用哪些包作为依赖项的信息。这就是为什么它会问您所有关于包名称和描述的问题,以便如果您曾经发布它,人们将知道如何联系您,它做什么,版本是什么等等。
只有在您实际打算发布软件包时才需要认真考虑此事,这在网站的情况下不太可能发生,但在制作库的情况下非常可能发生。但是,正如您已经发现的那样,软件包应该具有唯一的名称,这就是为什么您应该给您的软件包起个个人化的名称,这样您就不会像在尝试命名与稍后要安装的软件包相同的软件包时遇到命名冲突那样。
所以让我们创建自己的软件包,并安装我们的第一个依赖项(记住,这只是另一个包)。我将选择time-stamp作为依赖项,因为它很好而且很小。
首先,您将创建项目目录。这只是一个空的新目录。让我们称其为ts。从ts目录中,输入npm init到终端并回答它的问题(尽管我通常只是按回车键),然后查看目录中的package.json文件。打开该文件,您将看到所有您的包信息。目前就是这样。
现在回到命令行并输入npm install time-stamp。等待它完成后,再次打开package.json,您将看到time-stamp被引用在“dependencies”列表中。(从npm 5开始,使用--save选项不再必要。npm现在默认假定这一点。npm install的--save选项是什么?
回到目录中,您还将看到另一个名为package-lock.json的文件和一个名为node_modules的目录。
node_modules目录将包含一个名为time-stamp的目录,其中包含使time-stamp工作的所有代码。您可能不需要经常查看这里,但是您可以这样做,如果您查看time-stamp目录内部,您将看到它有自己的package.json!打开它并查看,其中包含安装所需的所有信息。请注意,它没有任何依赖关系,但是如果有,它们将与所有它们的依赖关系一起安装在您的node_modules中...以及他们的依赖关系...以及他们的...如果您想看到这个过程,请尝试安装测试框架'jest。同样,只需输入npm install jest
希望整个过程现在开始变得有点清晰了...
锁文件略微复杂。它的作用是确保在将项目部署到新系统时,您使用完全相同的依赖项集。这是必需的,因为npm组织事物的方式可能取决于最新版本,等等,如果您尝试部署应用程序并且由于依赖项与开发环境中的不同而无法工作,那将非常令人恼火!
话虽如此,在此阶段您基本上可以忽略它!这是npm的重要组成部分,但除非您真的知道自己在做什么,否则不应直接编辑它。
安装依赖项后,您将能够在项目的任何地方使用requireimport,而不必担心将其指向目录结构中的正确路径。只需require('time-stamp')即可正常工作!
最后,恭喜您走到了这一步,值得一提的是全局安装。使用-g选项 - 也就是npm install time-stamp -g - 意味着该依赖项将安装在计算机上某个中央node_modules目录中,而不是您项目的node_modules文件夹中。但是,您仍然需要将其链接到您的项目中(以便它最终成为您的package.json中的依赖项),您可以通过键入npm link time-stamp来完成。个人而言,我喜欢将所有模块都局部化到我的项目中,但这也取决于您的用例和在一定程度上的个人偏好。
这意味着您的package.json和锁文件的组合是node_modules中所有文件的完美表示,这意味着您不需要将它们放在您的git(或其他仓库)中。您可以将您的仓库拉到新服务器上,只需键入npm install,它们就会从互联网上被下载下来。当您有一个大型项目时,这变得更加重要,因为涉及到依赖项中的所有文件,但从一开始就将“node_modules”添加到.gitignore是一个好习惯。但我开始偏离主题了,也许我应该在这里结束...
这只是一个基本介绍,所以我把它保持相对简单,我不想创建一个深入的教程,但如果您需要澄清我提出的任何观点,请随时评论,我会尽力进行编辑!

37

npm警告saveError ENOENT:找不到文件或目录,打开'/Users/{username}/package.json'

  • 您没有package.json文件> 使用npm init

  • 您在错误的目录中> cd转到包含package.json的文件夹中,如下所示:

    cd C://Dev/MySolution/MyWebProject 然后再试一次。


npm警告media-queries-nikhil@1.0.0没有说明

npm警告media-queries-nikhil@1.0.0没有存储库字段。

阿布利法(Abulifa)的回答解释了您的项目可能会作为自己的npm包发布... 在这种情况下,这些警告将有助于警告您的package.json缺少某些字段。

如果您知道您永远不会作为npm软件包发布,并且想要隐藏这些警告,请将以下内容添加到您的package.json文件中:

"description": "filling out this field to avoid warnings",
"repository": "not publishing",
"readme": "not publishing",
"license": "not publishing",

你没有 package.json 文件 > 使用 npm init 这个命令可以帮到我。谢谢。 - undefined

18

13

问题:

npm install失败,并出现以下错误信息:
npm WARN saveError ENOENT: no such file or directory, open '.../package.json'' error

原因:

npm install需要在当前目录中找到package.json文件,但该文件不存在。

解决方法:

假设有2个目录:

C:\dir1_p\       <--------- package.json exists
C:\dir2\         <--------- package.json does not exist

cd C:\dir1_p\
npm intall      <---------- PASS, since package.json is present

cd C:\dir2\
npm intall      <---------- ERROR, since package.json is Not present  (this was my problem)

那么,当你执行npm install命令时,你是否在正确的目录下?

情况1:如果你在错误的目录下,请使用cd命令切换到存在package.json文件的目录下,然后执行npm install命令。

情况2:如果你在正确的目录下,并且想要创建一个新的package.json文件,则运行npm init命令并按ENTER键完成初始化,这将在当前目录下创建package.json文件。现在可以运行npm install命令了。

希望对某些人有所帮助。


1
是的,它起作用了。我在尝试在Node中安装MySQL时遇到了这个错误。谢谢。 - MindRoasterMir

4

当我运行以下命令时,我遇到了同样的问题:

npm install -g @vue/cli

经过大量的研究和实验,唯一有效的解决方案是:

npm install -g @vue/cli@latest

3

你不能将项目名称命名为你尝试安装的包名称。

请在 package json 中重新命名你的项目并重试或再次尝试 npm init 并使用另一个名称。


0

一个主要的问题可能是您不在根文件夹,在那里应该运行npm install,请确保您在客户端文件夹或服务器端,而不是在一些随机文件或没有package.json的父文件夹中。


-7

关闭项目并重新打开,这将解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接