G运行t 任务可以从它们 运行 所在的文件夹导航 "up" 吗?

Can Grunt tasks navigate "up" from the folder they are run in?

我正在尝试构建我的资产,以便多个项目可以共享构建脚本的 "phase"。例如,如果我有 3 个基于网络的产品都使用 Bootstrap 和 jQuery,我只想从共享的 "library".

获取库

文件夹的结构建议如下:

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

我希望每个 "app" 文件夹中的 Gruntfile.js 能够 "import" 或以其他方式执行 sharedGrunt.js。我还没有跨过那座桥,因为我停留在第一个概念验证测试:一个简单的副本。

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

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

如您所见,我尝试从 G运行t 文件向上一级。这是包含 "shared"、"app1" 和 "app2" 的目录。然后向下导航到共享库文件夹以获取 jQuery.

任务是 "successful"(没有抛出实际错误),但没有复制文件。

我怎样才能实现我的目标?我是否需要将 "catch-all" g运行tFile 放入包含所有项目的 "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 的回答中观察到的提示,我继续前进并确定我有两个缺陷:

  1. 我应该简单地提供目标目录。如果我尝试提供一个文件名,它将创建一个附加目录,其名称与我认为的文件名相同;这是 Xavier 的观察结果。

  2. 如果您不为副本发出 "cwd",它会从源端复制整个目录树。

因此,以下内容:

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

导致在目标中找到的文件为“"dev/common/lib/jquery.js"”。这不是预期的行为。


解决方案:

  1. 将目标作为目录提供,而不是文件名。它将使用原始文件名。
  2. 在复制之前发出 CWD,这样源路径就不会合并到目标路径中。

工作任务:

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

生成的文件源自 "../common/lib/jquery.js" 并按预期在目标 "dev/js/jquery.js" 结束。