grunt-sftp-deploy无法读取authKey的凭据
grunt-sftp-deploy以前工作得很稳定。现在我收到一个会中止流程的警告:
Warning: Cannot read properties of undefined (reading 'authKey').
我有grunt的使用经验,因此对自己的语法相当有把握。
Here's my Gruntfile code:
'sftp-deploy': {
img: [ {
auth: connectkey,
cache: false,
src: '../images/AA-toUpload/',
dest: idmserverpath + 'images/',
exclusions: [ '*.svg', '**/.DS_Store' ],
progress: false
} ]
}
下面是我的Gruntfile代码:
'sftp-deploy': {
img: [ {
auth: connectkey,
cache: false,
src: '../images/AA-toUpload/',
dest: idmserverpath + 'images/',
exclusions: [ '*.svg', '**/.DS_Store' ],
progress: false
} ]
}
我也有类似的用于CSS和 JPG的区块,它们各自显示自己的src、dest和排除项。对于这些以及图片的用法,上传都是一连串grunt任务中的最后一步。图片会被最小化、转换成多种尺寸并生成.webp。CSS文件会被最小化并拼接,这些任务都运行正常。只有上传会中止。
我在 { } 块周围加上方括号,因为我遇到了一个致命错误。加上方括号就解决了。
Fatal error: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received undefined
"connectkey" 和 "idmserverpath" 是变量。
connectkey - { host: 'ftp.address.com', port: 2233, authKey: 'foolsgold9' };
idmserverpath = "home/mywebsitefolder/public_html/"; // path to the server
服务器路径可以通过Cyberduck手动测试/工作。
authKey位于一个名为.ftppass的 JSON文件中,和Gruntfile位于同一目录。
{
"foolsgold9": {
"username": "user",
"password": "xx-random-saved-chars-xx"
}
}
同样,这些凭据在Cyberduck中工作。无论如何,根据我收到的警告,这个文件似乎没有被读取。
我正在使用一个被称为grunt-sftp-deploy-i的插件的“改进”版本。使用未改进的版本grunt-sftp-deploy时也会得到同样的错误。
插件在NPM页面是这么写的:
If keyLocation is not specified, grunt-sftp-deploy looks for keys at ~/.ssh/id_dsa
我在 ~/.ssh文件夹中没有名为id_dsa的文件,于是我新建了一个,用和.ftppass文件中相同的json代码填充。这个没帮助。我得说,把json代码放到 ~/.ssh文件夹里对我来说是新领域,能力有限,因此如果你有任何建议,请尽情提出。我也不确定json代码是否适用于那个文件。
顺便一提,在安装grunt插件时确实会报告一些漏洞。在这种情况下,我使用了grunt audit fix和 grunt audit fix --force,但对某些插件没有可用的修复。我希望这不是问题所在。
在Stack Overflow上关于此事有不少提问,主要来自大约十年前的情况。看起来很多用户都漏掉了.ftppass文件。但我确实有它,而且似乎没有被读取。
解决方案
我发现了一个恼人的解决办法,但至少它奏效。
- 我对致命错误("The first argument must be of type string...")的聪明修复其实是个错误。给代码块加上方括号反而阻止了脚本访问.ftppass。最初之所以会出现这个错误,是因为我安装了grunt-sftp-deploy-i(据说是“改进”的版本)。如果改为安装原生的grunt-sftp-deploy,就再也没有这个错误。
- 尽管脚本找到了.ftppass的凭据,但在上传时仍然崩溃。我的“讨厌”的修复是使用一个更早版本的Node。我之前用的是26.4。现在需要回退到18.20.8,这还需要把npm降级至10.8.2。这是2025年 3月 27日的代码。结论是,对于Gruntfile中的其他插件,我需要确保获取与较早版本的npm和 Node兼容的版本。
- 还要提到,把json代码放进 /.ssh文件夹里本来就不是正确的做法。