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 的回答中观察到的提示,我继续前进并确定我有两个缺陷:
我应该简单地提供目标目录。如果我尝试提供一个文件名,它将创建一个附加目录,其名称与我认为的文件名相同;这是 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"
结束。
我正在尝试构建我的资产,以便多个项目可以共享构建脚本的 "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 的回答中观察到的提示,我继续前进并确定我有两个缺陷:
我应该简单地提供目标目录。如果我尝试提供一个文件名,它将创建一个附加目录,其名称与我认为的文件名相同;这是 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"
结束。