[備忘録][ワークアラウンド]Visual Studio Codeの拡張機能「SFTP」が「No such file」と言って動かなくなった！ on Windows

# はじめに

※本記事のファイルパスの `hoge` は、適宜ユーザ名に読み替えてください。

Visual Studio Code（以下「VSCode」と記します）の拡張機能に「SFTP」というものがあります。

https://marketplace.visualstudio.com/items?itemName=liximomo.sftp

SFTPを使ってサーバ側とクライアント側でファイルの同期ができる拡張機能で、当方では[hokkaidosm.net プリキュアデータ](https://precure.hokkaidosm.net/)の開発用サーバとのファイル同期に使用しています。

# 発生した事象について

先日オープンしたこちらのページ。

https://precure.hokkaidosm.net/movies/history/29_yumenomachi/

このページに、鑑賞履歴を追加しようとJSONを編集。
いつも通り保存すると、本来であれば開発用サーバに新しいファイルが送信され、開発用サーバで確認することができるのですが…。

```
[05-29 20:13:51] [error] Error: No such file
	at SFTPStream._transform (c:\Users\hoge\.vscode\extensions\liximomo.sftp-1.12.9\node_modules\ssh2-streams\lib\sftp.js:412:27)
	at SFTPStream.Transform._read (internal/streams/transform.js:205:10)
	at SFTPStream._read (c:\Users\hoge\.vscode\extensions\liximomo.sftp-1.12.9\node_modules\ssh2-streams\lib\sftp.js:183:15)
	at SFTPStream.Transform._write (internal/streams/transform.js:193:12)
	at writeOrBuffer (internal/streams/writable.js:358:12)
	at SFTPStream.Writable.write (internal/streams/writable.js:303:10)
	at Channel.ondata (internal/streams/readable.js:719:22)
	at Channel.emit (events.js:315:20)
	at addChunk (internal/streams/readable.js:309:12)
	at readableAddChunk (internal/streams/readable.js:284:9)
	at Channel.Readable.push (internal/streams/readable.js:223:10)
	at SSH2Stream.<anonymous> (c:\Users\hoge\.vscode\extensions\liximomo.sftp-1.12.9\node_modules\ssh2\lib\Channel.js:167:15)
	at SSH2Stream.emit (events.js:315:20)
	at parsePacket (c:\Users\hoge\.vscode\extensions\liximomo.sftp-1.12.9\node_modules\ssh2-streams\lib\ssh.js:3288:10)
	at SSH2Stream._transform (c:\Users\hoge\.vscode\extensions\liximomo.sftp-1.12.9\node_modules\ssh2-streams\lib\ssh.js:694:13)
	at SSH2Stream.Transform._read (internal/streams/transform.js:205:10)
	at SSH2Stream._read (c:\Users\hoge\.vscode\extensions\liximomo.sftp-1.12.9\node_modules\ssh2-streams\lib\ssh.js:253:15)
	at SSH2Stream.Transform._write (internal/streams/transform.js:193:12)
	at writeOrBuffer (internal/streams/writable.js:358:12)
	at SSH2Stream.Writable.write (internal/streams/writable.js:303:10)
	at Socket.ondata (internal/streams/readable.js:719:22)
	at Socket.emit (events.js:315:20)
	at addChunk (internal/streams/readable.js:309:12)
	at readableAddChunk (internal/streams/readable.js:284:9)
	at Socket.Readable.push (internal/streams/readable.js:223:10)
	at TCP.onStreamRead (internal/stream_base_commons.js:188:23) when local ➞ remote c:\Users\hoge\Documents\precure\html_precure\movies\history\data\29_yumenomachi.json
```

突然ファイルがSFTPサーバにアップできなくなってしまったのです。

# 思い当たる節は…？

今回更新したファイルですが、SSH経由で確認するとちゃんと所定の場所にありました。
しかも先週、同じ方法でトロプリ[^tropical]第13話の口癖データの更新に成功しているのです。

https://precure.hokkaidosm.net/habits/018/014/

[^tropical]: 「トロピカル～ジュ！プリキュア」の略称

あえて言うならば、VSCodeのバージョンアップがあったくらいかな…？

# こういうときはIssuesが上がっていないか見てみる

サーバの設定も一切いじっていないので、もしかして同じ事象に遭遇した人がそのことを書いているのかも、と思い、この拡張機能のリポジトリにあるIssuesをチェック。
するとドンピシャのIssueが上がっていました。

https://github.com/liximomo/vscode-sftp/issues/919

そこにはこんなコメントが。

https://github.com/liximomo/vscode-sftp/issues/919#issuecomment-838586635

> 1. Do a search inside `~/.vscode/extensions/liximomo.sftp-1.12.9/node_modules/ssh2-streams/lib/sftp.js`
for `options.emitClose = false;`
> 2. Add `options.autoDestroy = false;` after both instances.

私はWindowsユーザですのでどのファイルを開けば良いのかわかりません、という方のために上記を日本語化してWindows対応にした手順を記載します。

# 解決方法 for Windows

1. `%USERPROFILE%\.vscode\extensions\liximomo.sftp-1.12.9\node_modules\ssh2-streams\lib\sftp.js` ファイルを、何らかのテキストエディタで開きます。<br />
   たいていの場合は `C:\Users\hoge\.vscode\extensions\liximomo.sftp-1.12.9\node_modules\ssh2-streams\lib\sftp.js` というパスになるかと思います。
1. 検索コマンドで、 `options.emitClose = false;` を検索します。2箇所在ります。
1. 検索コマンドで見つかった `options.emitClose = false;` のあとに、（改行を入れるか入れないかはお任せします）`options.autoDestroy = false;` と記載します。2箇所とも同じ記載を入れます。
1. すでにVSCodeを立ち上げている場合は、それを再起動するか `Ctrl+Shift+P` でコマンドパレットを開き、 `Developer: Reload Window` を実行します。

# 終わりに

こうして、鑑賞履歴に今日のデータを追加することができました。

ただ、この拡張機能、リポジトリを見る限り最終更新が2年前なんですよね…。

https://github.com/liximomo/vscode-sftp

こんなIssueまで立てられてしまっています。

https://github.com/liximomo/vscode-sftp/issues/937

代わりになる拡張機能ってないですかね？

## 拡張機能に求めるもの

* ファイルを更新すると、自動的にSFTPで指定フォルダにアップしてくれること。フォルダがなければ作成もしてくれること。
* 公開鍵認証（*.ppk、パスフレーズ付き）が可能なこと。
* SFTPサーバ側のポート番号を指定できること（攻撃防御のため、ポート番号を標準のものとは別の番号にしてあります）。
* アップロードしないファイルやフォルダをその名前で指定できること（`.vscode`とか`.git`とかはアップロードしないようにする必要があります）。