Gruntjs Grunt任务可以导航吗;“向上”;从运行它们的文件夹中?

Gruntjs Grunt任务可以导航吗;“向上”;从运行它们的文件夹中?,gruntjs,grunt-contrib-copy,Gruntjs,Grunt Contrib Copy,我正在尝试构建我的资产,以便多个项目可以共享构建脚本的“阶段”。例如,如果我有3个基于web的产品都使用Bootstrap和jQuery,那么我只想从共享的“库”中获取库 建议文件夹的结构如下所示: shared -sharedGrunt.js (file) -lib (folder) -bootstrap (folder) -jQuery.js (file) app1 -Gruntfile.js (file) -src (folder) -images

我正在尝试构建我的资产,以便多个项目可以共享构建脚本的“阶段”。例如,如果我有3个基于web的产品都使用Bootstrap和jQuery,那么我只想从共享的“库”中获取库

建议文件夹的结构如下所示:

shared
  -sharedGrunt.js (file)
  -lib (folder)
    -bootstrap (folder)
    -jQuery.js (file)
app1
  -Gruntfile.js (file)
  -src (folder)
    -images (folder)
    -js (folder)
    -etc
app2
  -Gruntfile.js (file)
  -src (folder)
    -images (folder)
    -js (folder)
    -etc
copy: {
  externalTest: {
    expand: true,
    src: '../shared/lib/jQuery.js',
    dest: 'dev/js/jQuery.js',
    flatten: true
  }
}
我希望每个“app”文件夹中的Gruntfile.js能够“导入”或以其他方式执行
sharedGrunt.js
。我还没有跨过这座桥,因为我被困在第一个概念验证测试中:一个简单的副本

因此,在应用程序的
Gruntfile.js
文件中,我有一个复制任务,如下所示:

shared
  -sharedGrunt.js (file)
  -lib (folder)
    -bootstrap (folder)
    -jQuery.js (file)
app1
  -Gruntfile.js (file)
  -src (folder)
    -images (folder)
    -js (folder)
    -etc
app2
  -Gruntfile.js (file)
  -src (folder)
    -images (folder)
    -js (folder)
    -etc
copy: {
  externalTest: {
    expand: true,
    src: '../shared/lib/jQuery.js',
    dest: 'dev/js/jQuery.js',
    flatten: true
  }
}
正如你所看到的,我试图从Gruntfile升级一级。这是包含“shared”、“app1”和“app2”的目录。然后向下导航到共享库文件夹,以获取jQuery

任务“成功”(未引发实际错误),但未复制任何文件


我怎样才能实现我的目标?我是否需要将“catch all”gruntFile放入包含所有项目的“parent”文件夹中?我不希望开发人员要求检查整个父级。我希望开发人员能够签出“app1”和“shared”并使用它运行。

这很奇怪-Grunt在任何级别上都没有问题,在我的机器上,您的代码确实复制了1个文件

但是,使用
expand
会导致grunt使用
dest
属性作为目录,因此您的文件最终是
dev/js/jQuery.js/jQuery.js
(注意重复)

通过以下操作修复:

copy: {
  externalTest: {
    expand: true,
    src: '../shared/lib/*.js',
    dest: 'dev/js',
    flatten: true
  }
}

在Xavier回答中的观察结果的推动下,我继续前进,并确定我有两个缺陷:

  • 我应该简单地提供目标目录。如果我试图提供一个文件名,它将创建一个额外的目录,其中包含我认为应该是文件名的名称;这是per Xavier的观察结果

  • 如果不为副本发出“cwd”,它将从源端复制整个目录树

  • 因此,以下是:

    share: {
      expand: true,
      src: '../common/lib/jquery.js',
      dest: 'dev/js/'
    }
    
    结果在目标中找到一个名为“dev/common/lib/jquery.js”的文件。这不是故意的行为


    解决方案:

  • 将目标提供为目录,而不是文件名。它将使用原始文件名
  • 在复制之前发出CWD,以便源路径不会合并到目标路径中
  • 工作任务:

    share: {
      expand: true,
      cwd: '../common/lib',
      src: 'jquery.js',
      dest: 'dev/js/'
    }
    

    结果生成一个源于
    “./common/lib/jquery.js”
    的文件,并按预期在目标
    “dev/js/jquery.js”
    处结束。

    感谢您确认它应该工作;您还告诉我只提供目标目录而不是文件名。还有一些其他的问题,但由于这个答案,我最终找到了我的解决方案。