◆ ダウンロード完了後に Unexpected EOF エラー
◆ その後リトライは別の HTTP のエラーレスポンス
◆ ダウンロードは完了してるみたいなので ダウンロード済みファイルを使うようにインストーラを改造して対処
◆ Meteor は気軽にあれこれいじるのに向かなそう

Meteor のインストール

Meteor をインストールしようとしたらエラーでました
インストール方法は npm ではなく独自のインストーラのシェルスクリプトになります

他のフレームワークとは違って meteor というコマンドが 「/usr/local/bin」 以下にインストールされて このコマンドでプロジェクトを作ったり実行したりとちょっと特殊です

実行するコマンドはこれです

curl https://install.meteor.com/ | sh

実行してみると シェルスクリプト内部の処理で Meteor のファイルのダウンロードが始まります
170MB くらいあってけっこう時間がかかります

ダウンロードの curl でエラー

そしてやっと終わったと思ったら

Downloading Meteor distribution
######################################################################## 100.0%
curl: (56) Unexpected EOF
Retrying download in 5 seconds...
######################################################################## 100.0%
curl: (22) The requested URL returned error: 416
Retrying download in 5 seconds...
######################################################################## 100.0%
curl: (22) The requested URL returned error: 416
Retrying download in 5 seconds...

curl のエラーがでました
100% になっているのに Unexpected EOF というエラーになってリトライをするのですが それ以降は 「416 Requested Range Not Satisfiable」 が返ってきてるみたいです
何度かやっても同じ結果で最初はダウンロードできて 100% まで行くのに Unexpected EOF というエラーです

この curl エラーはシェルスクリプトの内部で実行される Meteor のダウンロードなのでコマンドに打ってる 「https://install.meteor.com/」 のダウンロードとは違います

Meteor の Issues に行くとそれらしいものはあるのですが 2015 年とか 2016 年とかです
最近に絞ると何もでてこないです

ダウンロードしてるファイル

実行しているシェルスクリプトは https://install.meteor.com/ なので中を読むとダウンロードしてるファイルの URL は

https://static-meteor.netdna-ssl.com/packages-bootstrap/1.6.1.1/meteor-bootstrap-os.linux.x86_64.tar.gz

でした

私の場合はこうなっていましたが URL の作成は

https://static-meteor.netdna-ssl.com/packages-bootstrap/${RELEASE}/meteor-bootstrap-${PLATFORM}.tar.gz

という文字列の変数を展開したものです
RELEASE は今の最新版で 「1.6.1.1」 になっていました
PLATFORM のほうは fedora だと 「os.linux.x86_64」になるようです

何度もエラーになるので このファイルが壊れてるのかと思い Windows でダウンロードしてみると普通に開けました
でも 直接 Linux 上で curl コマンドを使ってみると Unexpected EOF なのは変わりません

curl https://static-meteor.netdna-ssl.com/packages-bootstrap/1.6.1.1/meteor-bootstrap-os.linux.x86_64.tar.gz --output $HOME/.meteor-tarball-tmp

エラーにはなるものの 100% になってますし ファイルは残ってるので無理矢理このダウンロードしたファイルを使わせてみます

ダウンロード済みファイルを使う

上のコマンドで指定してる output の場所がインストーラが指定してる場所です
そこにすでにファイルがあるのでインストーラのダウンロードの部分を消してしまえばすでにダウンロード済みのものを使ってくれます

まずはインストーラをダウンロードします

curl https://install.meteor.com/ > meteor.sh

この meteor.sh を編集して

while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]
do
ATTEMPTS=$((ATTEMPTS + 1))

curl $VERBOSITY --fail --continue-at - \
"$TARBALL_URL" --output "$TARBALL_FILE"

if [ $? -eq 0 ]
then
break
fi

echo "Retrying download in $RETRY_DELAY_SECS seconds..."
sleep $RETRY_DELAY_SECS
done

の部分を消します
ここがダウンロードと失敗したら繰り返しをしてる部分です
ダウンロードの時間が長いので別にダウンロードしていたファイルを使う方法にしましたが まだダウンロードしたのがローカルにないならエラーチェックしないでそのままダウンロードしたのを使うというように書き換えてもいいと思います

またダウンロード済みを使う場合は

# Remove temporary files now in case they exist.
cleanUp

も消しておく必要があります
ダウンロード前に一時ファイルのパスをクリアしてるのでせっかくダウンロードしたのが削除されます

あとは

sh meteor.sh

で編集済み sh ファイルを実行すれば tar.gz ファイルを解凍してインストールしてくれます

100% にはなってたものなので 解凍でも問題なくインストールは成功しました
ファイルに問題ないなら curl のエラーはいったいどうして起きるのでしょうね

使った感じ

インストールもできたしと使ってみましたが 思った以上に使いづらいです
サーバもクライアントもまとまったタイプのフレームワークですし 他とは違うものとは思ってましたけどここまでとは思いませんでした
最初からいろいろ設定されててこうすればいい みたいなチュートリアルはあるものの 自分がこうしたいというのをやる方法が見つけづらい感じです
もっとシンプルなサンプルがいっぱいあるといいのですけどね

フレームワーク自体がシンプルな作りなら 自分でコードみたりして仕組みを把握できればいろいろ勝手が効くのですが Meteor は内部でいろいろ複雑なことしてそうで 単純なコマンドで作ったり実行はできるようになってるもののカスタマイズは慣れるまでは大変そうです

npm じゃない独自のパッケージマネージャとかあるくらいですしね
https://atmospherejs.com/

さらには npm のパッケージ入れるには npm コマンドじゃなくて meteor コマンドの中で npm サブコマンドを使うという方法だったりします

プロジェクトを作ったり実行するときにも 1 分近くロードで待たされてる感じで内部でビルドとかすごくいろいろやってそうです
サンプルで作ってくれるデフォルトのプロジェクトは時間の割に中身がほとんどない と思ったら .meteor フォルダ以下にいろいろありました
node_modules 以下はシンプルで .meteor 以下がメインのようです

ちなみに実行時にシンボリックリンク作成が必要みたいで cifs マウント環境だと実行ができなかったです
※ (追記) こっちの記事で cifs マウント環境でも実行できるようにする方法を書いてます

気軽にちょっと使ってみるというのは大変そうなのでまた暇な時にでも使って見るかもです