当前位置: 首页 > 面试题库 >

如何根据更改的文件来修改grunt watch任务?

巫研
2023-03-14
问题内容

我正在编写一个node.js程序,该程序将监视包含大量(300 ish)数量的scss项目的目录。将配置Grunt-
watch(可以通过节点模块运行,也可以单独运行,无论如何工作),以便每当更改scsss文件时,都将使用罗盘对其进行编译,并将输出文件移至单独的目录,例如:

./1234/style.scss已更改>> grunt-watch运行grunt-compass >>
/foo/bar/baz/1234/style.css已更新

该文件所在的项目目录显然非常重要(如果grunt-
compass将所有已编译的文件发送到同一目录,它们将变得混乱且无法使用,grunt自动化将毫无目的)。为了确保将所有文件都路由到正确的位置,每次更新CSS文件时,我都会动态更改grunt-
compass设置。

示例gruntfile:

module.exports = function(grunt) {

grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    watch: {
      files: './*/*.scss',
      tasks: ['compass']
    },
    compass: {
      origin:{
        options: {
          //temportary settings to be changed later
          sassDir: './',
          cssDir: './bar',
          specify: './foo.scss'
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-compass');

  grunt.event.on('watch', function(action, filepath, target) {
    var path = require('path');
    grunt.log.writeln(target + ': ' + filepath + ' might have ' + action);
    var siteDirectory = path.dirname(filepath);

    //changes sass directory to that of the changed file
    var option = 'compass.origin.options.sassDir';
    var result = __dirname + '/' + siteDirectory;
    grunt.log.writeln(option + ' changed to ' + result);
    grunt.config(option, result);

    //customizes css output directory so that file goes to correct place
    option = 'compass.origin.options.cssDir';
    result = path.resolve(__dirname, '../', siteDirectory);
    grunt.log.writeln(option + ' changed to ' + result);
    grunt.config(option, result);

    //grunt.task.run(['compass']);

  });

};

但是,这不起作用。如果以详细模式运行“ grunt
watch”,您将看到grunt在单独的进程中同时运行grunt.event.on函数和watch任务。gruntfile的第二次解析将我的所有event.on
config更改为上面的默认值,并且罗盘无法运行。

如在event.on注释中所示,我尝试添加grunt.task.run()以确保指南针与event.on函数在同一进程中运行,这将保留我的配置更改。但是该任务拒绝运行,可能是因为我做错了。

不幸的是,grunt.event.on变量不会发送到已定义的grunt-
watch任务,否则我可以编写一个自定义函数来更改罗盘设置,然后在同一过程中运行罗盘。

我尝试使用指南针中内置的watch函数在不费吹灰之力的情况下实施此操作,但是指南针每个项目只能存储一个静态输出路径,并且一次只能监视一个项目。

我目前通过添加一个以站点名称为参数的节点程序来解决这个问题,该节点程序通过使用fs运行重写grunfile.js,然后通过exec函数运行“ grunt
watch”。但是,这有其自身的缺点(我无法查看grunt.log数据)并且令人费解,所以我想更改它。

非常感谢您的见解。


问题答案:

您需要指定

options : { nospawn : true }

在监视任务配置中,以使监视在相同的上下文中运行:

watch: {
  files: './*/*.scss',
  tasks: ['compass'],
  options : { nospawn : true }
}

有关更多信息,请参阅本节文档。



 类似资料:
  • 问题内容: 我想我的调用或当我指定一个文件被修改浏览器。修改文件后,我该如何“观看”该文件以执行某些操作? 以编程方式看来,这些步骤是..基本上每秒设置一个永无休止的间隔,并缓存初始修改日期,然后每当更改一次调用X时便比较该日期。 问题答案: 如前所述,您可以使用pyinotify: 例如: 这比轮询更有效。内核会告诉您何时进行操作,而无需您不断询问。

  • 问题内容: 环顾四周,但找不到一个示例。没有解释文档,我无法弄清楚。 如何修改文件(例如,README.md),为修改后的文件创建提交,然后将提交推送到服务器? Nodegit:http ://www.nodegit.org/ Nodegit文档:http ://www.nodegit.org/nodegit 问题答案: 有一个示例,说明如何在其存储库上创建/添加和提交,可以帮助您修改文件。 ht

  • 为了运行ASP. NET Core应用程序,我生成了一个dockerfile来构建应用程序并将源代码复制到容器中,该容器由Git使用Jenkins获取。所以在我的工作区中,我在dockerfile中执行以下操作: 虽然Jenkins使用Git正确更新了我主机上的文件,但Docker不会将其应用于我的映像。 我的基本建筑脚本: 我尝试了不同的方法,例如用于docker run的rm和no cache

  • 问题内容: 我正在使用Python,并且想在不删除或复制文件的情况下将字符串插入文本文件。我怎样才能做到这一点? 问题答案: 取决于你要做什么。要附加,可以用打开它: 如果要先添加某些内容,则必须先从文件中读取:

  • 问题内容: 我有一个XML文档,在它已经包含数据之后,我想对其进行更新。 我考虑过要在(附加)模式下打开XML文件。问题在于新数据将在根结束标记之后写入。 如何删除文件的最后一行,然后从该点开始写入数据,然后关闭根标签? 当然,我可以读取整个文件并进行一些字符串操作,但是我认为这不是最好的主意。 谢谢你的时间。 问题答案: 您绝对 不应该做 的快速简便的方法(请参阅下文)是使用来将整个文件读入字符

  • 我正在VS Code中处理一个React项目,并试图将我所有的文件推送到一个新的Git Web URL。原因是我更改了存储库的名称,导致Web URL也发生了变化。我刚刚从我的项目中提交的所有更改都被推送到旧URL,但我需要将它们提交到新URL。但由于我没有未更改的文件,我无法从VS Code工作室内推送它们。 有没有一种方法可以在没有对我的任何文件进行任何新更改的情况下,通过我的新web URL