【问题标题】:NPM doesn't install module dependencies when deploying a Grunt app to heroku将 Grunt 应用程序部署到 heroku 时,NPM 不会安装模块依赖项
【发布时间】:2014-01-08 01:01:54
【问题描述】:

我使用 grunt 创建了一个静态单页站点。我现在正在尝试使用heroku-buildpack-nodejs-grunt 将它部署到heroku 用于节点咕噜声。

下面是我的根目录的图片:

这是我的Gruntfilepackage.json

Procfile:

web: node index.html

当我运行 $ git push heroku master 时,它会到达 Gruntfile 并失败:

-----> Found Gruntfile, running grunt heroku:production task
>> Local Npm module "grunt-contrib-uglify" not found. Is it installed?

上述错误继续将所有本地 NPM 模块列为未找到。如果我列出所有 loadNpmTasks 而不是使用“load-grunt-tasks”,我会得到完全相同的错误。

当我$ heroku logs 我得到:

Starting process with command `node web.js`
Error: Cannot find module '/app/web.js'

谁能看出我哪里出错了?

【问题讨论】:

    标签: json node.js heroku gruntjs


    【解决方案1】:

    我唯一能想到的可能是 Heroku 先安装了你的 devDependencies,然后尝试运行 Grunt,但由于它还没有安装 load-grunt-tasks,所以你没有得到 grunt.loadNpmTasks( 'grunt-contrib-uglify' ); 行(其中load-grunt-tasks 为你做),因此 Grunt 找不到包。

    您可以尝试更改您的 Gruntfile 以使用 grunt.loadNpmTasks() 方法明确列出所有 npm 模块吗?

    编辑:

    刚想起另一件我必须做的事:

    heroku labs:enable user-env-compile -a myapp
    heroku config:set NODE_ENV=production
    

    (显然将 myapp 替换为您的 Heroku 应用名称。)

    这使 Heroku 允许用户设置环境变量,然后将您的服务器设置为 production。试一试,然后将您的 dependenciesdevDependencies 设置为原来的样子(只是看看它是否有效)。

    【讨论】:

    • 谢谢,但这个方法没有骰子。但是,我检查了“heroku 日志”,发现没有提到未在 heroku 上安装的模块,而是:“使用命令 node web.js 启动进程”“错误:找不到模块 '/app/web.js'”。也许是我没有正确编写heroku Procfile?
    • 可能是,虽然它是一个非常小的文件。 :) 我的只有一行:web: node app/app.js
    • 我还想知道您是否应该尝试将您的 grunt 模块添加到 dependencies 而不仅仅是 devDependencies... 我的意思是,您不应该... 我没有,但也许只是为了看看它是否有效?
    • 我认为是这样。我不喜欢我必须那样做。在我的任何谷歌搜索中都没有看到这一点(我不是编码员!)。这次我几乎完成了完整的 gruntfile 编译。 haml 任务出现新错误,但这只是我没有在项目中安装 Ruby 和 Haml。
    • 顺便说一句,我的 Procfile 使用了“web: node index.html”,这似乎有效。
    【解决方案2】:

    对于经过这里的任何人,我都无法解决问题。这就是我要去的地方:

    在我的 Gruntfile 中,我将 npm 模块从 devDependencies 移到了依赖项。 Heroku 然后能够安装这些依赖项。

    但是,当 Heroku 运行任务时,它会在 haml 任务处停止,并出现错误“您需要在 PATH 中安装 Ruby 和 Haml 才能使该任务正常工作”。将 ruby​​ 和 haml 作为引擎添加到 Gruntfile 中不起作用。

    【讨论】:

      【解决方案3】:

      我来这里玩游戏已经很晚了,但我已经使用了几种方法,并认为我会分享。

      选项 1:让 Heroku 构建

      这不是我最喜欢的方法,因为它可能需要很长时间,但无论如何都是这样。

      Heroku 在收到您推送的更改时运行npm install --production。这只会安装生产依赖项。

      您无需更改环境变量即可安装开发依赖项。 npm install 有一个 --dev switch 允许你这样做。

      npm install --dev
      

      Heroku 提供了一篇关于如何customize your build 的文章。本质上,您可以在 package.json 中将上述命令作为 postinstall 脚本运行。

      "scripts": {
        "start": "node index.js",
        "postinstall": "npm install --dev && grunt build"
      }
      

      我认为这比将开发依赖项放在我的生产部分或来回更改环境变量以构建我的依赖项要干净。

      另外,我不使用 Procfile。 Heroku 可以通过调用npm start 来运行您的应用程序(至少现在它可以在 OP 之后将近两年)。因此,只要您提供该脚本(如上所示),Heroku 就应该能够启动您的应用程序。

      就您的 ruby​​ 依赖而言,我没有尝试在 Heroku 上的节点应用程序中安装 ruby​​ gem,但 this SO answer 建议您使用 multi buildpack

      选项 2:部署您的依赖项

      有些人认为让 Heroku 构建您的应用程序是一种糟糕的形式。他们建议您应该提升所有依赖项。如果您像我一样讨厌签入node_modules 目录的想法,那么您可以创建一个新分支,在其中强制添加node_modules 目录,然后部署该分支。在 git 中是这样的:

      git checkout -b deploy
      git add -f node_modules/
      git commit -m "heroku deploy"
      git push heroku --force deploy:master
      git checkout master
      git branch -D deploy
      

      你显然可以把它写成一个脚本,这样你就不必每次都输入了。

      选项 3:自己动手

      这是我最喜欢的新部署方式。 Heroku 增加了对slug deploys 的支持。上一个链接很好读,我强烈推荐它。我在Travis-CI 的自动构建中执行此操作。我有一些自定义脚本来 tar 我的应用程序并将 slug 推送到 Heroku 及其快速。

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题,Heroku 没有安装我的所有依赖项,而我在本地没有问题。我通过运行修复它

        heroku config:set USE_NPM_INSTALL=true
        

        进入我部署项目的路径。这指示 Heroku 使用 npm install 而不是 npm ci 安装您的依赖项,这是默认设置!来自 Heroku 开发中心:

        “Heroku 使用锁文件(package-lock.json 或 yarn.lock)来安装预期的依赖树,因此请务必将这些文件签入 git 以确保跨环境的依赖版本相同。如果您使用npm,Heroku 将使用 npm ci 来设置构建环境。”

        【讨论】:

          猜你喜欢
          • 2014-10-16
          • 1970-01-01
          • 2013-08-26
          • 1970-01-01
          • 2019-06-07
          • 2014-10-16
          • 2020-03-01
          • 2014-02-17
          • 2014-10-06
          相关资源
          最近更新 更多