※より良い解決策を「 2021/09/24追記 」に記載した。
Linux上のファイルをVisual Studio Codeで楽に編集するため、VS CodeからSFTPでアップロード/ダウンロードしたいと考えた。
- Windows 10 Pro 20H2
- Visual Studio Code 1.57.1
- SFTP 1.12.9 (SFTP/FTP sync, liximomo) 拡張機能
以下を参考にsftp.jsonを記述して、RemoteからLocalに同期を取った。
これでVS Codeで編集する環境が整ったので、あるファイルを修正してUploadを実行したところ、No such fileと言うエラーが表示された。
sftpのエラーメッセージを確認すると、編集したファイルが実際には存在するのに、存在しないと言っている様子であることが確認された。
検索したところ、sftpの不具合(Nodeとの不整合)であるとの記事が見つかった。
この記事に記載の通り、sftp.jsの2918行で定義されているWriteStream関数に options.autoDestroy = false;
と追記し、VS Codeを再起動することでエラーを回避することができた。
C:\Users\ユーザー名\.vscode\extensions\liximomo.sftp-1.12.9\node_modules\ssh2-streams\lib\sftp.js
function WriteStream(sftp, path, options) {
:
:
// For backwards compat do not emit close on destroy.
options.emitClose = false;
options.autoDestroy = false;
:
:
}
なお、本記事は、現時点でQiitaには同様の記事が見つからなかったので、共有を広めるために記載したものである。
2021/09/24追記
アップデートが2019年から止まっているliximomo氏のSFTPに変わり、Natizyskunk氏によりforkされたSFTPが登場している。
現時点では、No such fileエラーが出ず、現在も維持管理が行われているため、こちらをインストールすることを推奨する。
移行手順
- liximomo氏のSFTPを削除
- Natizyskunk氏のSFTPをインストール
- VS Codeを再起動
(@taikisさん、ありがとうございました!)
2021/10/03追記
.vscode/sftp.json の "remotePath" で指定したサーバー側のパスをタイプミスしても、エラーにならず、新規ディレクトリと解釈される点に要注意である。
SFTP: Sync Remote -> Local を実行すると、サーバー側にはファイルがないので直ぐ正常終了となるため、指定したパスが間違っていることに気が付かない(SFTPプラグインの不正動作を疑ったらそこでハマる)。
SFTP: Upload Active File を実行すると、サーバー側に新しいディレクトリが作成されて、そこにファイルがアップロードされるので、ここでも指定したパスが間違っていることに気が付かない。(サーバー側の正しいディレクトリにあるファイルが更新されないが、ここでもSFTPプラグインの不正動作を疑ったらそこでハマる)。
エラーが起きないのに、意図した通りにアップロード/ダウンロードされない場合、 "remotePath" に指定したパスのタイプミスを最初に疑うべきである(自分への戒め)。