tag:crieit.net,2005:https://crieit.net/tags/gulp-imagemin/feed 「gulp-imagemin」の記事 - Crieit Crieitでタグ「gulp-imagemin」に投稿された最近の記事 2021-11-28T17:45:22+09:00 https://crieit.net/tags/gulp-imagemin/feed tag:crieit.net,2005:PublicArticle/17792 2021-11-28T17:45:22+09:00 2021-11-28T17:45:22+09:00 https://crieit.net/posts/gifsicle-error-gifsicle-pre-build-test-failed-20211128 yarn 時に gifsicle で gifsicle pre-build test failed エラー <p>数日前から yarn 時に gifsicle で gifsicle pre-build test failed エラーが出るようになってしまったので対処します。</p> <p>あれこれ試しましたが、結論から言うと <code>imagemin-gifsicle</code> が依存している <code>gifsicle</code> の <code>5.0.0</code> だとダメなので、 <code>resolution</code> で <code>5.2.1</code> を指定すると良さそうです。</p> <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <pre><code class="json"> "devDependencies": { // 略 "gulp-imagemin": "^7.1.0", "imagemin-mozjpeg": "^9.0.0", "imagemin-pngquant": "^9.0.2", "imagemin-gifsicle": "^7.0.0", "imagemin-svgo": "^9.0.0", // 略 } </code></pre> <p><code>imagemin-gifsicle</code> を使用しているプロジェクトで <code>yarn</code> したところ、以下のエラーで失敗するようになってしまいました。</p> <pre><code class="bash">warning Error running install script for optional dependency: "PATH\\TO\\PROJECT\\node_modules\\gifsicle: Command failed. Exit code: 1 Command: node lib/install.js Arguments: Directory: PATH\\TO\\PROJECT\\node_modules\\gifsicle Output: Response code 404 (Not Found) gifsicle pre-build test failed compiling from source Error: Command failed: C:\\WINDOWS\\system32\\cmd.exe /s /c \"autoreconf -ivf\" 'autoreconf' �́A�����R�}���h�܂��͊O���R�}���h�A ����\\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B at PATH\\TO\\PROJECT\\node_modules\\bin-build\\node_modules\\execa\\index.js:231:11 success Saved lockfile. </code></pre> <p>バージョンを上げても直後は特に問題なかったような気はするのですが、逐一キャッシュを削除したりしているわけではないので不明。</p> <p>仕方ないので、色々ググりながら対応してみます。</p> <h2 id="対処 (失敗したものたち)"><a href="#%E5%AF%BE%E5%87%A6+%28%E5%A4%B1%E6%95%97%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%9F%E3%81%A1%29">対処 (失敗したものたち)</a></h2> <h3 id="gisicle を足す"><a href="#gisicle+%E3%82%92%E8%B6%B3%E3%81%99">gisicle を足す</a></h3> <pre><code class="json"> "devDependencies": { // 略 "gulp-imagemin": "^7.1.0", "imagemin-mozjpeg": "^9.0.0", "imagemin-pngquant": "^9.0.2", "imagemin-gifsicle": "^7.0.0", "gifsicle": "6.1.0", // 追加 "imagemin-svgo": "^9.0.0", // 略 } </code></pre> <p>変わらず。</p> <h3 id="逆にいっそ gulp-imagemin 以外全て削除"><a href="#%E9%80%86%E3%81%AB%E3%81%84%E3%81%A3%E3%81%9D+gulp-imagemin+%E4%BB%A5%E5%A4%96%E5%85%A8%E3%81%A6%E5%89%8A%E9%99%A4">逆にいっそ gulp-imagemin 以外全て削除</a></h3> <pre><code class="json"> "devDependencies": { // 略 "gulp-imagemin": "^7.1.0", // 略 } </code></pre> <p>変わらず。</p> <h3 id="コマンドプロンプトを管理者実行"><a href="#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E7%AE%A1%E7%90%86%E8%80%85%E5%AE%9F%E8%A1%8C">コマンドプロンプトを管理者実行</a></h3> <p><code>gifsicle</code> ありの状態で <code>cmd.exe</code> を管理者として実行→変わらず。</p> <h3 id="キャッシュ削除"><a href="#%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E5%89%8A%E9%99%A4">キャッシュ削除</a></h3> <pre><code>> yarn cache clean yarn cache v1.22.11 success Cleared cache. Done in 450.56s. </code></pre> <p>変わらず。</p> <h3 id="hosts に Github 関係の名前解決を書き込む"><a href="#hosts+%E3%81%AB+Github+%E9%96%A2%E4%BF%82%E3%81%AE%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80">hosts に Github 関係の名前解決を書き込む</a></h3> <pre><code>>ping raw.githubusercontent.com raw.githubusercontent.com [185.199.108.133]に ping を送信しています 32 バイトのデータ: 185.199.108.133 からの応答: バイト数 =32 時間 =5ms TTL=58 185.199.108.133 からの応答: バイト数 =32 時間 =5ms TTL=58 185.199.108.133 の ping 統計: パケット数: 送信 = 2、受信 = 2、損失 = 0 (0% の損失)、 ラウンド トリップの概算時間 (ミリ秒): 最小 = 5ms、最大 = 5ms、平均 = 5ms </code></pre> <p>元々 <code>raw.githubusercontent.com</code> に ping はできていましたが、 <code>hosts</code> に次のように追記してみます。</p> <pre><code>52.74.223.119 github.com 192.30.253.119 gist.github.com 54.169.195.247 api.github.com 185.199.111.153 assets-cdn.github.com 151.101.76.133 raw.githubusercontent.com 151.101.76.133 gist.githubusercontent.com 151.101.76.133 cloud.githubusercontent.com 151.101.76.133 camo.githubusercontent.com 151.101.76.133 avatars0.githubusercontent.com 151.101.76.133 avatars1.githubusercontent.com 151.101.76.133 avatars2.githubusercontent.com 151.101.76.133 avatars3.githubusercontent.com 151.101.76.133 avatars4.githubusercontent.com 151.101.76.133 avatars5.githubusercontent.com 151.101.76.133 avatars6.githubusercontent.com 151.101.76.133 avatars7.githubusercontent.com 151.101.76.133 avatars8.githubusercontent.com </code></pre> <p>変わらず。</p> <p>なお、ここまで次の issue にあった対処法。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/imagemin/imagemin-gifsicle/issues/33">Error: Command failed: C:\WINDOWS\system32\cmd.exe /s /c "autoreconf -ivf" · Issue #33 · imagemin/imagemin-gifsicle · GitHub</a></li> </ul> <h3 id="ネットワークを変更"><a href="#%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%92%E5%A4%89%E6%9B%B4">ネットワークを変更</a></h3> <p>違う場所に出かけて、ゲートウェイを変更してみました。</p> <p>が、変わらず。</p> <h3 id="最小限構成で実験する"><a href="#%E6%9C%80%E5%B0%8F%E9%99%90%E6%A7%8B%E6%88%90%E3%81%A7%E5%AE%9F%E9%A8%93%E3%81%99%E3%82%8B">最小限構成で実験する</a></h3> <p>長丁場になりそうだったので最小限構成の <code>package.json</code> を作成して検証を続行。</p> <pre><code>{ "name": "tmp", "version": "1.0.0", "main": "index.js", "license": "MIT", "devDependencies": { "imagemin-gifsicle": "^7.0.0" } } </code></pre> <p>これで<code>yarn</code>。変わらず。</p> <p>ちなみに <code>yarn.lock</code> の中身は次のような感じ。</p> <pre><code>gifsicle@^5.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-5.3.0.tgz#499713c6f1e89ebbc3630da3a74fdb4697913b4e" integrity sha512-FJTpgdj1Ow/FITB7SVza5HlzXa+/lqEY0tHQazAJbuAdvyJtkH4wIdsR2K414oaTwRXHFLLF+tYbipj+OpYg+Q== dependencies: bin-build "^3.0.0" bin-wrapper "^4.0.0" execa "^5.0.0" imagemin-gifsicle@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-7.0.0.tgz#1a7ab136a144c4678657ba3b6c412f80805d26b0" integrity sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA== dependencies: execa "^1.0.0" gifsicle "^5.0.0" is-gif "^3.0.0" </code></pre> <p><code>imagemin-gifsicle</code> が依存している <code>gifsicle</code> のバージョンが悪いのではないか、と思い <code>resolutions</code> を追加することにしました。</p> <h3 id="resolutions を追加"><a href="#resolutions+%E3%82%92%E8%BF%BD%E5%8A%A0">resolutions を追加</a></h3> <pre><code class="json">{ "name": "tmp", "version": "1.0.0", "main": "index.js", "license": "MIT", "devDependencies": { "imagemin-gifsicle": "^7.0.0" }, "resolutions": { "gifsicle": "^6.1.0" } } </code></pre> <p>すると、 <code>yarn</code> は通りました。</p> <p>しかし、 6系 は "Use native ESM" なので <code>require</code> を使用している現環境での使用は不可です。惜しい。</p> <h3 id="resolutions の指定を 5.3.0 にする"><a href="#resolutions+%E3%81%AE%E6%8C%87%E5%AE%9A%E3%82%92+5.3.0+%E3%81%AB%E3%81%99%E3%82%8B">resolutions の指定を 5.3.0 にする</a></h3> <pre><code>[email protected], gifsicle@^5.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-6.1.0.tgz#16194fe7d9420a539709eb065e7245eaf74de5a7" integrity sha512-tmnKbW2UQzoc/FTg2dq98sUaoGM1/CRQP+HtyeIMNLDlB8ijZbX7TKBCc2s5YJ8oXUZIxdqXH2rKXnCB0/Hg3w== dependencies: bin-build "^3.0.0" bin-wrapper "^4.0.0" execa "^5.1.1" </code></pre> <p><a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/gifsicle">gifsicle - npm</a>を確認したところ、11/26現在で <code>6.1.0</code> と並んで "3 days ago" となっている 5系 最新の <code>5.3.0</code> があることが判明。</p> <pre><code class="json">{ "name": "tmp", "version": "1.0.0", "main": "index.js", "license": "MIT", "devDependencies": { "imagemin-gifsicle": "^7.0.0" }, "resolutions": { "gifsicle": "^5.3.0" } } </code></pre> <p>しかしNG。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/imagemin/gifsicle-bin/issues/134">5.3.0 is error · Issue #134 · imagemin/gifsicle-bin · GitHub</a></li> </ul> <blockquote> <p>yep, this repo's 5.3.0 tag is missing, that makes the downloading process of bin-wrapper failed.</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/imagemin/gifsicle-bin/issues/134">5.3.0 is error · Issue #134 · imagemin/gifsicle-bin · GitHub</a></p> </blockquote> <p>タグ付けをミスって生まれてしまったバージョンらしいので、これは使えないとのこと。なんて紛らわしい……。</p> <h2 id="resolutions の指定を 5.2.1 にする"><a href="#resolutions+%E3%81%AE%E6%8C%87%E5%AE%9A%E3%82%92+5.2.1+%E3%81%AB%E3%81%99%E3%82%8B">resolutions の指定を 5.2.1 にする</a></h2> <pre><code class="json">{ "name": "tmp", "version": "1.0.0", "main": "index.js", "license": "MIT", "devDependencies": { "imagemin-gifsicle": "^7.0.0" }, "resolutions": { "gifsicle": "5.2.1" } } </code></pre> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sotarok/items/4ebd4cfedab186355867">package.json のチルダ(~) とキャレット(^) - Qiita</a></li> </ul> <p><code>^5.2.1</code> とキャレットを付けると <code>5.2.1 <= version < 6.0.0</code> となってしまい、 <code>5.3.0</code> に上がってしまうので <code>5.2.1</code> とキャレットを外して指定します。</p> <pre><code>[email protected], gifsicle@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-5.2.1.tgz#efadab266a493ef0b4178e34597493349937369e" integrity sha512-9ewIQQCAnSmkU2DhuWafd1DdsgzAkKqIWnY+023xBLSiK9Az2TDUozWQW+SyRQgFMclbe6RQldUk/49TRO3Aqw== dependencies: bin-build "^3.0.0" bin-wrapper "^4.0.0" execa "^5.0.0" imagemin-gifsicle@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/imagemin-gifsicle/-/imagemin-gifsicle-7.0.0.tgz#1a7ab136a144c4678657ba3b6c412f80805d26b0" integrity sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA== dependencies: execa "^1.0.0" gifsicle "^5.0.0" is-gif "^3.0.0" </code></pre> <p>これでようやく通りました。処理も無事にできることを確認。</p> <p>……思ったよりも手間取りました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="gifsicle"><a href="#gifsicle">gifsicle</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/imagemin/imagemin-gifsicle/issues/33">Error: Command failed: C:\WINDOWS\system32\cmd.exe /s /c "autoreconf -ivf" · Issue #33 · imagemin/imagemin-gifsicle · GitHub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/imagemin/imagemin-gifsicle/issues/37">Install failed gifsicle@4.0.1 postinstall · Issue #37 · imagemin/imagemin-gifsicle · GitHub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/imagemin/gifsicle-bin/issues/102">Command failed: C:\WINDOWS\system32\cmd.exe /s /c "autoreconf -ivf" "autoreconf" · Issue #102 · imagemin/gifsicle-bin · GitHub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/facebook/docusaurus/issues/1804">'autoreconf' is not recognized as an internal or external command · Issue #1804 · facebook/docusaurus · GitHub</a> <ul> <li><code>taobao.org</code> って中国ですよね……試す気にはなれないですね……。</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/65147246/cannot-find-module-gifsicle-for-loading-image-webpack">Cannot find module 'gifsicle' for loading image -webpack - Stack Overflow</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/gifsicle">gifsicle - npm</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/imagemin/gifsicle-bin/issues/134">5.3.0 is error · Issue #134 · imagemin/gifsicle-bin · GitHub</a></li> </ul> <h3 id="package.json"><a href="#package.json">package.json</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sotarok/items/4ebd4cfedab186355867">package.json のチルダ(~) とキャレット(^) - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17604 2021-08-17T23:17:25+09:00 2021-08-17T23:17:25+09:00 https://crieit.net/posts/gulp-imagemin-become-pure-esm-package-20210817 gulp-imagemin で Error [ERR_REQUIRE_ESM]: Must use import to load ES Module と怒られる <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>ある日、 package gardening をして Gulp を走らせたら</p> <blockquote> <p>Error [ERR_REQUIRE_ESM]: Must use import to load ES Module</p> </blockquote> <p>と怒られてしまいました。</p> <pre><code class="bash">$ gulp Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: PATH\TO\PROJECT\DIRECTORY\node_modules\gulp-imagemin\index.js require() of ES modules is not supported. require() of PATH\TO\PROJECT\DIRECTORY\node_modules\gulp-imagemin\index.js from PATH\TO\PROJECT\DIRECTORY\gulp\tasks\imagemin.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules. Instead rename index.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from PATH\TO\PROJECT\DIRECTORY\node_modules\gulp-imagemin\package.json. </code></pre> <p>今回は <code>gulp-imagemin</code> のスクリプトの中に起因するようなので、そちらに手を入れるのは避けたいところです。</p> <p>さて、どうしたものか。</p> <h2 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h2> <p>結論から先にいうと、 <code>gulp-imagemin</code> をダウングレードすることで回避するしかなさそうです。</p> <p>今回は <code>8.0.0</code> から既存の <code>7.1.0</code> にダウングレードします。</p> <h2 id="調査"><a href="#%E8%AA%BF%E6%9F%BB">調査</a></h2> <h3 id="&quot;type&quot;: &quot;module&quot;"><a href="#%26quot%3Btype%26quot%3B%3A+%26quot%3Bmodule%26quot%3B">"type": "module"</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://var.blog.jp/archives/80335431.html">Node.js の ESModules</a></li> </ul> <p>検索すると、 <code>package.json</code> にパラメータを追記する方法が出てきます。</p> <pre><code class="json">{ "engines": { "node": ">=16.0.0", "npm": ">=6.14.9" }, "engineStrict": true, "prettier": {}, "type": "module" // 追記 } </code></pre> <p><code>"type": "module"</code> を追記する方法です。</p> <p>しかし、この方法を採用する場合、既存の Gulpタスク 全てを CommonJS (<code>require</code>) から ES Modules (<code>import</code>) に書き換える必要があります。</p> <p>それはそれで既存スクリプトの書き換えが大変なことになってしまうので、この方法は今回は不採用。</p> <h3 id="公式リポジトリを覗く"><a href="#%E5%85%AC%E5%BC%8F%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E8%A6%97%E3%81%8F">公式リポジトリを覗く</a></h3> <p>そこで公式リポジトリを覗いてみます。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/sindresorhus/gulp-imagemin/issues/356">I have a question · Issue #356 · sindresorhus/gulp-imagemin · GitHub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/sindresorhus/gulp-imagemin/issues/355">8.0.0 - ESM only? Serious? · Issue #355 · sindresorhus/gulp-imagemin · GitHub</a></li> </ul> <p>早速同じ内容の Issues が散見されます。そして回答では「リリースノートを見よ」とのこと。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/sindresorhus/gulp-imagemin/releases">Releases · sindresorhus/gulp-imagemin · GitHub</a></li> </ul> <blockquote> <p>This package is now pure ESM. Please <a target="_blank" rel="nofollow noopener" href="https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c">read this</a>.</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/sindresorhus/gulp-imagemin/releases">Releases · sindresorhus/gulp-imagemin · GitHub</a></p> </blockquote> <p>最初からここを見ましょう、という話ではあるのですが。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c">Pure ESM package · GitHub</a></li> </ul> <p>ご覧の通り、「<code>8.0.0</code> からは ES Modules のパッケージになっていますよー」というアナウンス。</p> <p>したがって、先の結論の通り CommonJS を使用したければダウングレードせよ、ということになります。是非もなし。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://var.blog.jp/archives/80335431.html">Node.js の ESModules</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/tomon9086/scraps/3a1d9d3eed4864">ESMで書かれたライブラリをNextで使うと[ERR_REQUIRE_ESM]で落ちる件について</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/sindresorhus/gulp-imagemin/issues/356">I have a question · Issue #356 · sindresorhus/gulp-imagemin · GitHub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/sindresorhus/gulp-imagemin/issues/355">8.0.0 - ESM only? Serious? · Issue #355 · sindresorhus/gulp-imagemin · GitHub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/sindresorhus/gulp-imagemin/releases">Releases · sindresorhus/gulp-imagemin · GitHub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c">Pure ESM package · GitHub</a></li> </ul> arm-band