【问题标题】:No node_modules from netlify deploy没有来自 netlify 的 node_modules 部署
【发布时间】:2019-02-05 03:47:25
【问题描述】:

我已经使用 Netlify 和 git repo 进行了持续部署设置,但到目前为止,无论我做什么,Netlify 都不是npm-installing 任何东西。当我下载部署的 zip 时没有 node_modules 文件夹,我的站点无法访问 node_modules,它只是不存在。我从一个随机的 npm 包 (lodash) 开始尝试安装它,但到目前为止我一无所获。

Netlify 说它会自动运行npm install。我试过没有构建命令,我尝试添加 npm install 作为构建命令,但没有任何结果。

package.json:

{
  "name": "netlify-test",
  "version": "1.0.0",
  "description": "stuff",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electrovir/netlify-test.git"
  },
  "author": "electrovir",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/electrovir/netlify-test/issues"
  },
  "homepage": "https://github.com/electrovir/netlify-test#readme",
  "dependencies": {
    "lodash": "^4.17.11"
  }
}

HTML:

<!doctype html>
<html>

<head>
    <title>
        hi
    </title>
    <script src="node_modules/lodash/_apply.js"></script>
</head>

<body>
    Why can't this find node_modules??
</body>

</html>

【问题讨论】:

    标签: npm-install netlify


    【解决方案1】:

    花了一段时间才弄清楚这一点,但我发现当你有一个 package.json 时,Netlify 确实 npm install 进入你的 repo 根目录或 基本目录。这可以通过将 Build 命令 更改为 ls 并读取部署控制台输出(将列出 node_modules 文件夹)来查看。

    但是,在运行 Build 命令 之后和部署之前的某个时间点,此 node_modules 会被删除。因此,如果您使用类似于以下的内容作为构建命令,则可以将node_modules 复制到您的发布目录

    rm -rf dist && mkdir dist && rsync -rv * dist --exclude ./dist
    

    这会将基本目录内容复制到dist,我已将其设置为我的发布目录,忽略./dist本身(它不能复制到本身)。如果将其作为 npm 脚本添加到 package.json 中并为您的构建命令添加npm run &lt;script name&gt;,那就更好了。

    请注意,Base directoryBuild commandPublish directory 都在 Deploys > Deploy settings 下或在 Netlify 中设置 > 构建和部署

    感谢 lastmjs 帮助解决这个问题。

    【讨论】:

    • 很高兴找到您的答案,但对 Netlify 的需要感到非常失望。
    【解决方案2】:

    如果node_modules 在那里,那就太奇怪了。 Netlify 的持续部署确实为您运行 npm install,当且仅当您的存储库的根目录中有一个 package.json(或者如果您在 netlify.toml 中设置了一个,则在 base 目录中。但是,它也使用部署目录之外的自定义 npm 目录(在此处查看它的设置方式:https://github.com/netlify/build-image/blob/master/run-build-functions.sh#L34),因为在浏览时为 static site 部署 node_modules 不需要 - 仅在构建时。

    Netlify 部署的预期路径是:

    1. 你已经将你的依赖管理器配置签入到你的 git repo 的根目录(如果没有在 UI 或 toml 文件中设置base 目录)或base 目录(如果设置)。这可以是Gemfile.lockpackage.jsonyarn.lockrequirements.txt 中的任何/全部,如this article about the build settings at Netlify 中所述
    2. 您没有将node_modules 存储在存储库中。其中许多将特定于构建环境的体系结构-您的本地计算机几乎肯定与 Netlify 的不同。您会希望在构建时生成这些内容。
    3. 您的构建旨在在构建期间使用这些模块。因此,您可以使用例如dotenv 在构建时读取您的.env 文件,或者您使用gulp-cli 来处理您的Gulpfile.js
    4. 您的构建完成,并且您在构建期间使用了所有模块来生成独立的 html/js/css/images,因此您已经完成了它们 - 您的静态 html 和其他资产在您的发布目录中生成,其中构建过程有意放置您的节点模块,因此它们没有被部署。您的静态网站在运行时不需要这些模块,因此在其中部署(数千个!)文件效率不高或不需要。

    您可能遇到需要其中一些/一个的情况 - 例如function 或者您甚至可能在静态站点上也需要其中一个文件 - 这很好,您可以随意将其明确复制到发布目录中。但这不是常态:)

    【讨论】:

    • 我确实在我的仓库中忽略了node_modules,但我并没有真正的构建过程(......但是)但我希望我的前端能够访问node_modules。对不起,我想我可以在构建部分更清楚,但我终于找到了一个解决方案(最终与你关于明确复制它的最后一段相似)。感谢您的回答!
    猜你喜欢
    • 2020-05-09
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多