【问题标题】:Restart Heroku local on file change?在文件更改时重新启动 Heroku 本地?
【发布时间】:2016-03-12 19:16:51
【问题描述】:

似乎以“heroku local web”启动的本地服务器不会监视文件更改并自行重启。我怎样才能做到这一点?

【问题讨论】:

    标签: node.js heroku watch nodemon


    【解决方案1】:

    最简单的方法是使用heroku local 作为可执行文件运行nodemon - 即nodemon --exec "heroku local"

    但是,heroku local 以非零退出代码退出默认 nodemon 关闭信号 (SIGUSR2),因此您需要向 nodemon 添加一个附加标志以将中断信号设置为 SIGTERM。

    nodemon --exec "heroku local" --signal SIGTERM

    (使用 heroku-cli@6.14.31-33a2d0a、nodemon@1.12.1、node@8.5.0 测试)

    【讨论】:

    • 这可以正常工作 - 重新启动 heroku local 并进行任何更改。
    • 效果很好!谢谢!
    • 不适用于 nodemon 1.11.0 但升级到 1.18.3 并且可以工作
    【解决方案2】:

    heroku local 只使用了node-foreman (https://www.npmjs.com/package/heroku-local),所以直接使用观看更方便。

    首先,安装foremannodemon

    npm i --save-dev foreman nodemon
    

    现在,您需要在 package.json 中设置两个脚本:

    {
      ...
      "scripts": {
        "start": "nf start",
        "watch": "nodemon --watch directory-to-watch"
      },
      ...
    }
    

    您现在可以在监视该目录并重新加载更改时运行应用程序

    npm run watch
    

    【讨论】:

      【解决方案3】:

      我认为heroku localwatch 用于更改静态资源(客户端代码)。但是,每次更改 Web 服务器的源代码(服务器端代码)时手动重新启动服务器显然并不理想。

      如果您正在创建 NodeJS 应用程序,我的建议是尝试 Gulp 提供的 watch 命令。但是,这也需要您 (a) 安装 Gulp,以及 (b) 编写 Gulp 脚本。同样,此解决方案仅适用于 NodeJS,如果 heroku local 为您查看文件,则不需要这些步骤。

      1. 安装NodeJS
      2. 安装Gulp

        npm install gulp --save-dev
        
      3. 添加 Gulp 脚本(Procfile 所在的位置)

        注意:无法使以下watch 代码成功运行,但它可能会为其他人提供一个模板来创建有效的解决方案。

        var gulp = require('gulp');
        var exec = require('child_process').exec;
        
        gulp.task('heroku-local', function () {
          exec("heroku local");
        });
        
        gulp.task('heroku-local:watch', function () {
          gulp.watch([
            'file-to-watch',
            'folder-to-watch/**/*'
          ], ['heroku-local']);
        });
        
      4. 运行 Gulp 脚本(从 Procfile 所在的目录)

         gulp heroku-local:watch
        

      【讨论】:

      • 你试过spawn的方法吗? nodejs.org/api/… 这可能行得通...
      • 我正在使用 gulp 观察程序通过访问我创建的特殊路由 /killme 来终止节点进程,然后再次启动它。当然这个网址不应该存在于现场网站上,但在本地很有用。在 gulpfile 中:exec("curl http://localhost:5000/killme ; heroku local"); 在我的 node.js/express 应用程序中:router.get('/killme', function(req,res) { process.exit(1); });
      【解决方案4】:

      对于任何遇到此帖子以寻找解决方案的人...如果您可以在计算机上全局安装 nodemon,您可以更新 heroku Procfile (https://devcenter.heroku.com/articles/procfile) 以使用 nodemon 而不是 node:

      web: nodemon index.js

      同样,必须全局安装 nodemon 才能正常工作:

      npm i -g nodemon

      然后你应该可以正常在本地运行 heroku 并使用 nodemon 监视更改:

      heroku local web

      【讨论】:

        【解决方案5】:

        (创建答案,因为我还不能回复)

        补充https://stackoverflow.com/users/12663699/nick-ruiz答案,

        你不需要全局安装 nodemon。

        您可以将其作为开发依赖项

        npm i nodemon --save-dev

        然后,在您的项目根目录中创建一个 Procfile,其中包含 node_modules 中的 nodemon 路径。

        web: node index.js
        dev: ./node_modules/nodemon/bin/nodemon.js index.js
        

        这样您就可以运行heroku local 并让它在更改时重新启动。

        (这适用于希望在容器上运行 node index.js 并在本地计算机上运行 nodemon index.js 的用户)

        【讨论】:

          猜你喜欢
          • 2012-06-25
          • 1970-01-01
          • 2012-06-15
          • 1970-01-01
          • 2010-10-27
          • 2020-11-08
          • 1970-01-01
          • 2015-09-10
          • 2019-02-13
          相关资源
          最近更新 更多