dest()#

创建一个流,用于将 Vinyl 对象写入文件系统。

用法#

const { src, dest } = require('gulp');
function copy() {
返回 src('input/*.js')
.pipe(dest('output/'));
}
exports.copy = copy;

签名#

dest(directory, [options])

参数#

参数类型备注
directory
(必需)
字符串
函数
文件将被写入到的输出目录的路径。如果使用函数,则该函数将使用每个 Vinyl 对象调用,并且必须返回一个字符串目录路径。
options对象在下面的选项中详细说明。

返回#

可以在管道中间或末尾使用的流,用于在文件系统上创建文件。每当 Vinyl 对象通过流时,它会将内容和其他详细信息写入给定目录中的文件系统。如果 Vinyl 对象具有 symlink 属性,则会创建符号链接,而不是写入内容。创建文件后,其 元数据将被更新 以匹配 Vinyl 对象。

每当在文件系统上创建文件时,Vinyl 对象都会被修改。

  • cwdbasepath 属性将被更新以匹配创建的文件。
  • stat 属性将被更新以匹配文件系统上的文件。
  • 如果 contents 属性是流,它将被重置,以便可以再次读取。

错误#

directory 为空字符串时,抛出带有消息“无效的 dest() 文件夹参数。请指定一个非空字符串或函数”的错误。

directory 不是字符串或函数时,抛出带有消息“无效的 dest() 文件夹参数。请指定一个非空字符串或函数”的错误。

directory 是返回空字符串或 undefined 的函数时,发出带有消息“无效的输出文件夹”的错误。

选项#

对于接受函数的选项,将使用每个 Vinyl 对象调用传递的函数,并且必须返回另一列出的类型的值。

名称类型默认值备注
cwd字符串
函数
process.cwd()将与任何相对路径结合以形成绝对路径的目录。对于绝对路径,将忽略它。用于避免将 directorypath.join() 结合使用。
mode数字
函数
Vinyl 对象的 stat.mode创建文件时使用的模式。如果没有设置并且 stat.mode 丢失,则将使用进程模式。
dirMode数字
函数
创建目录时使用的模式。如果没有设置,则将使用进程模式。
overwrite布尔值
函数
true为 true 时,覆盖具有相同路径的现有文件。
append布尔值
函数
false为 true 时,将内容添加到文件的末尾,而不是替换现有内容。
sourcemaps布尔值
字符串
函数
false为 true 时,将内联 sourcemaps 写入输出文件。指定一个 string 路径将在给定路径处写入外部 sourcemaps
relativeSymlinks布尔值
函数
false为 false 时,创建的任何符号链接都将是绝对的。
注意:如果正在创建连接点,则忽略此项,因为它们必须是绝对的。
useJunctions布尔值
函数
true此选项仅与 Windows 相关,在其他地方被忽略。为 true 时,将目录符号链接创建为连接点。详情见下文 Windows 上的符号链接

元数据更新#

每当 dest() 流创建文件时,都会将 Vinyl 对象的 modemtimeatime 与创建的文件进行比较。如果它们不同,则将更新创建的文件以反映 Vinyl 对象的元数据。如果这些属性相同,或者 gulp 没有权限进行更改,则会静默跳过尝试。

此功能在 Windows 或不支持 Node 的 process.getuid()process.geteuid() 方法的其他操作系统上禁用。这是因为 Windows 通过使用 fs.fchmod()fs.futimes() 会产生意外结果。

注意fs.futimes() 方法在内部将 mtimeatime 时间戳转换为秒。在 32 位操作系统上,这种除以 1000 的操作可能会导致一些精度损失。

Sourcemaps#

Sourcemap 支持直接内置于 src()dest() 中,但默认情况下禁用。启用它以生成内联或外部 sourcemaps。

内联 sourcemaps

const { src, dest } = require('gulp');
const uglify = require('gulp-uglify');
src('input/**/*.js', { sourcemaps: true })
.pipe(uglify())
.pipe(dest('output/', { sourcemaps: true }));

外部源映射

const { src, dest } = require('gulp');
const uglify = require('gulp-uglify');
src('input/**/*.js', { sourcemaps: true })
.pipe(uglify())
.pipe(dest('output/', { sourcemaps: '.' }));

Windows 上的符号链接#

在 Windows 上创建符号链接时,将向 Node 的 fs.symlink() 方法传递一个 type 参数,该参数指定要链接的目标类型。链接类型设置为

  • 目标是常规文件时为 'file'
  • 目标是目录时为 'junction'
  • 目标是目录且用户禁用了 useJunctions 选项时为 'dir'

如果您尝试创建一个悬空链接(指向不存在的目标),则无法自动确定链接类型。在这些情况下,行为将根据悬空链接是通过 symlink() 还是通过 dest() 创建而有所不同。

对于通过 symlink() 创建的悬空链接,传入的 Vinyl 对象表示目标,因此其状态将确定所需的链接类型。如果 isDirectory() 返回 false,则创建 'file' 链接,否则根据 useJunctions 选项的值创建 'junction''dir' 链接。

对于通过 dest() 创建的悬空链接,传入的 Vinyl 对象表示链接 - 通常通过 src(..., { resolveSymlinks: false }) 从磁盘加载。在这种情况下,无法合理地确定链接类型,并且默认为使用 'file'。如果您正在创建到目录的悬空链接,这可能会导致意外行为。避免这种情况。