tag:crieit.net,2005:https://crieit.net/tags/npm/feed 「npm」の記事 - Crieit Crieitでタグ「npm」に投稿された最近の記事 2022-07-12T23:57:06+09:00 https://crieit.net/tags/npm/feed tag:crieit.net,2005:PublicArticle/18235 2022-07-12T23:57:06+09:00 2022-07-12T23:57:06+09:00 https://crieit.net/posts/create-react-app-ignores-x-high-severity-vulnerabilities-20220713 create-react-app(react-scripts) の X high severity vulnerabilities の警告について <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p><code>create-react-app</code>(<code>react-scripts</code>) で作ったアプリに対して、パッケージ追加等をすると次のような脆弱性の警告が表示されます。</p> <blockquote> <p>up to date, audited 1485 packages in 5s</p> <p>197 packages are looking for funding<br /> run <code>npm fund</code> for details</p> <p>6 high severity vulnerabilities</p> <p>To address all issues (including breaking changes), run:<br /> npm audit fix --force</p> <p>Run <code>npm audit</code> for details.</p> </blockquote> <p>脆弱性がある、と言われるとさすがに放置はできないのでどうにかできないものかと調べました。</p> <h2 id="対応"><a href="#%E5%AF%BE%E5%BF%9C">対応</a></h2> <p>結論から言うと、今回のケースでは無視して良い、とのことでした。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/appare45/articles/7f667031aab94b">create-react-appでは脆弱性の警告が出るが無視して良い</a></li> </ul> <p>理由としては</p> <ul> <li>警告の発出元である <code>npm audit</code> 自体の警告が不正確</li> <li>今回のケース(<code>create-react-app</code>(<code>react-scripts</code>))では依存パッケージはビルドツールとして用いられており、殆どの場合は成果物に含まれるわけではない (と思われる)</li> <li>ビルドツールとして脆弱性があればアップデートがあるはず</li> </ul> <p>といったところのようです。</p> <p>言われて見れば確かに、というところですね。</p> <p>それでも気になる場合は</p> <ul> <li><code>dependencies</code> にある <code>react-scripts</code> を <code>devDependencies</code> に移動させる <ul> <li><code>npm audit --production</code> を使用する</li> </ul></li> <li>パッケージインストール時は <code>npm install --no-audit</code> で <code>audit</code> を使用しないように指定する</li> </ul> <p>とすることで警告を表示させなくすることができるとのこと。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/appare45/articles/7f667031aab94b">create-react-appでは脆弱性の警告が出るが無視して良い</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/riversun/items/7f1679509f38b1ae8adb">npmパッケージのvulnerability対応フロー - Qiita</a></li> </ul> arm-band 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/17640 2021-09-08T23:30:59+09:00 2021-09-08T23:30:59+09:00 https://crieit.net/posts/refer-params-package-json-in-script-20210908 package.json の情報をスクリプト内で参照したい <p>package.json の情報をスクリプト内で参照したくなったのでその方法をメモ。</p> <h2 id="方法"><a href="#%E6%96%B9%E6%B3%95">方法</a></h2> <pre><code class="js">const packageJson = require('./package.json'); console.log(packageJson.version); // 0.0.1 console.log(packageJson.dependencies); // { bootstrap: '^5.1.0' } </code></pre> <p>普通に <code>require</code> で読み込めるようです。</p> <pre><code class="js">const packageJson = require('./package.json'); console.log(packageJson.version); // 0.0.1 console.log(packageJson.devDependencies['browser-sync']); // ^2.27.5 </code></pre> <p>パッケージ名にハイフンがある場合はオブジェクトのキー名を指定する形式で使用パッケージのバージョン情報が取得できますね。</p> <p>思ったよりも簡単にできることが確認できました。</p> <p>ちなみに……</p> <pre><code class="bash">> node -v v16.3.0 > npm -v 7.15.1 </code></pre> <p>実行環境はとあるプロジェクトでこんな感じでした。最新に上げないといけませんがそれはそれとして。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/k_bobchin/items/c3e43b944d436d857381">package.jsonのversionをコマンド(ワンライナー)で取り出したい - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://dev.to/origamium/package-json-1626">package.jsonの各種要素を読み込みたい! - DEV Community</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.npmjs.com/cli/v7/using-npm/scripts#packagejson-vars">scripts | npm Docs</a> <ul> <li><code>process.env.npm_package_XXXXXXXXXX</code> の形は手元の環境で試したところ <code>undefined</code> になってしまいました……</li> </ul></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17638 2021-09-07T23:46:08+09:00 2021-09-07T23:46:08+09:00 https://crieit.net/posts/npm-package-publish-20210907 npm でパッケージを公開する <p>一度は試してみたいと思っていた npmパッケージ の公開をやってみることにします。</p> <h2 id="パッケージの準備"><a href="#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E6%BA%96%E5%82%99">パッケージの準備</a></h2> <p>今回はテストのため、事前に作ってあった<a href="https://crieit.net/posts/show-image-in-consolelog-20210320">console.log で画像を表示するプログラム</a>で試すことにしてみます。</p> <p>ちなみにパッケージは以下のものがあるようなイメージで。</p> <ul> <li><code>package.json</code> <ul> <li><code>name</code></li> <li><code>description</code></li> <li><code>version</code></li> <li><code>main</code></li> <li><code>author</code></li> <li><code>license</code></li> <li>辺りが記述されていること</li> </ul></li> <li><code>.gitignore</code></li> <li>(<code>.npmignore</code>)</li> <li><code>LICENSE</code></li> <li>テストコード</li> <li>CI設定</li> </ul> <h3 id="リポジトリ"><a href="#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA">リポジトリ</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/console-cafebabe">GitHub - arm-band/console-cafebabe: npmパッケージのテスト。 console.log で画像を出力します。</a></li> </ul> <p>一揃いを準備。ついでに <a href="https://crieit.net/posts/badge-of-github-actions-with-chrome-extension-20210106">Github Actions でバッジを付けておきます</a>。</p> <h2 id="npm アカウントの作成"><a href="#npm+%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">npm アカウントの作成</a></h2> <p>続いて npm にアカウントを作成します。</p> <p><a href="https://crieit.now.sh/upload_images/9672fb71cb8e0333916557c2057655fa6137799cf1796.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9672fb71cb8e0333916557c2057655fa6137799cf1796.jpg?mw=700" alt="Sign Up" /></a></p> <p>Sign Up。</p> <p><a href="https://crieit.now.sh/upload_images/3c75850fb6182f5c8e4d336a184321ea613779a254a2b.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3c75850fb6182f5c8e4d336a184321ea613779a254a2b.jpg?mw=700" alt="必要事項の入力" /></a></p> <p>ユーザ名、パスワード、メールアドレスを入力。ちなみにメールアドレスはパッケージのメタ情報に含まれて第三者に公開される可能性がある、との注意書きがあるので念のため専用のメールアカウントを用意しておきます。</p> <p><a href="https://crieit.now.sh/upload_images/3bfd2188deb990ef3a473945295cd516613779a4c20dc.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3bfd2188deb990ef3a473945295cd516613779a4c20dc.jpg?mw=700" alt="ログイン後、ページトップに認証を求める通知が" /></a></p> <p>ログインするとメールでの認証を求められるので先ほど入力したメールアドレスに届いている認証のボタンを押しておきます。</p> <p><a href="https://crieit.now.sh/upload_images/7aa08684abb1c658284d0f62b6d37812613779a633ac7.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7aa08684abb1c658284d0f62b6d37812613779a633ac7.jpg?mw=700" alt="認証完了" /></a></p> <p>認証完了。</p> <h2 id="npmパッケージの公開"><a href="#npm%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E5%85%AC%E9%96%8B">npmパッケージの公開</a></h2> <p>npmアカウント の作成が完了したらいよいよパッケージの公開作業です。</p> <p>パッケージのプロジェクトのルートディレクトリでターミナルを開き、 <code>npm login</code> で npm にログインします。</p> <pre><code class="bash">> npm login npm notice Log in on https://registry.npmjs.org/ Username: YOURNPMUSERNAME Password: Email: (this IS public) [email protected] Logged in as YOURNPMUSERNAME on https://registry.npmjs.org/. </code></pre> <p>OK。次に念のためパッケージとして公開されるファイルを確認しておきます。</p> <pre><code class="bash">> npm pack npm notice npm notice 📦 [email protected] npm notice === Tarball Contents === npm notice 125B __tests__/main.test.js npm notice 401B .github/workflows/ci.yml npm notice 1.0kB LICENSE npm notice 44B bin/cli.js npm notice 36B bin/postinstall.js npm notice 82B index.js npm notice 57B jest.config.js npm notice 417B package.json npm notice 277B readme.md npm notice 6.9kB src/main.js npm notice === Tarball Details === npm notice name: console-cafebabe npm notice version: 0.0.1 npm notice filename: console-cafebabe-0.0.1.tgz npm notice package size: 6.7 kB npm notice unpacked size: 9.4 kB npm notice shasum: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx npm notice integrity: sha512-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx npm notice total files: 10 npm notice console-cafebabe-0.0.1.tgz </code></pre> <p><code>npm pack</code> するとtgz形式でパッケージの圧縮ファイルが生成されます。 <code>Tarball Contents</code> の中身や実際に展開して中身を確認し、公開したくないファイルが混ざってないか最後のチェックを行います。問題なければ公開へ。</p> <pre><code class="bash">> npm publish npm notice npm notice 📦 [email protected] npm notice === Tarball Contents === npm notice 125B __tests__/main.test.js npm notice 401B .github/workflows/ci.yml npm notice 1.0kB LICENSE npm notice 44B bin/cli.js npm notice 36B bin/postinstall.js npm notice 82B index.js npm notice 57B jest.config.js npm notice 417B package.json npm notice 277B readme.md npm notice 6.9kB src/main.js npm notice === Tarball Details === npm notice name: console-cafebabe npm notice version: 0.0.1 npm notice filename: console-cafebabe-0.0.1.tgz npm notice package size: 6.7 kB npm notice unpacked size: 9.4 kB npm notice shasum: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx npm notice integrity: sha512-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx npm notice total files: 10 npm notice + [email protected] </code></pre> <p><code>npm publish</code> で公開します。わりとあっという間に終わります。</p> <p><a href="https://crieit.now.sh/upload_images/9dc5e6e5eee184c74f284f6940e3cca7613779a830538.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9dc5e6e5eee184c74f284f6940e3cca7613779a830538.jpg?mw=700" alt="npm で自分のパッケージを検索してみる" /></a></p> <p>npm 上で検索すると公開したパッケージが見付かります。きちんと公開されていますね!</p> <h2 id="インストールテスト"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%86%E3%82%B9%E3%83%88">インストールテスト</a></h2> <p>今度はインストールしてみましょう。 <code>package.json</code> で以下のように自分のパッケージを <code>dependencies</code> に追加します。</p> <pre><code class="json"> "dependencies": { "console-cafebabe": "0.0.1" }, </code></pre> <p><code>npm i -D</code> または <code>yarn</code> 。</p> <p><a href="https://crieit.now.sh/upload_images/0118b0fb25910ab65c58a451c379e8a8613779a9e751f.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0118b0fb25910ab65c58a451c379e8a8613779a9e751f.jpg?mw=700" alt="node_modules の中に発見" /></a></p> <p><code>node_modules</code> の中に入ってきましたね。これだけでもちょっと感動。</p> <pre><code class="js">import consoleCafebabe from 'console-cafebabe'; consoleCafebabe.coffee(); </code></pre> <p>Webpack前提のプロジェクトのエントリポイントのJSに <code>import</code> して、想定通りの使い方としてメソッドを呼び出してみます。</p> <p><a href="https://crieit.now.sh/upload_images/e733769175cd251259e35b3af3b45d1d613779abdeefa.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e733769175cd251259e35b3af3b45d1d613779abdeefa.jpg?mw=700" alt="console.log に画像などが表示された" /></a></p> <p>作った通り、 <code>console.log</code> に画像や装飾された文字列が表示されました。成功です。</p> <h2 id="ログアウト"><a href="#%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A6%E3%83%88">ログアウト</a></h2> <pre><code class="bash">> npm logout > </code></pre> <p>パッケージ公開後は <code>npm logout</code> でターミナル上でもログアウトしておくと事故の確率が減らせそうなのでログアウトしておきます。</p> <p>これで一通りの流れは押さえることができたと思います。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2">初めてのnpm パッケージ公開 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/hoshimado/items/c6f1484297d974f44f19">npmでパッケージを公開してみた手順の記録 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/fnobi/items/f6b1574fb9f4518ed520">3分でできるnpmモジュール - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://chaika.hatenablog.com/entry/2019/08/15/000000">初めての npm パッケージ公開したメモ - かもメモ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/righteous/items/e5448cb2e7e11ab7d477#bin">【初心者向け】NPMとpackage.jsonを概念的に理解する - Qiita</a></li> </ul> <h3 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://bagelee.com/programming/javascript-2/patch-package/">かゆいところに手が届く!patch-packageでnpmパッケージを乗りこなそう - bagelee(ベーグリー)</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sadnessOjisan/items/3069e79038c961458ba2">思いもよらないものをnpm publishしてしまった話(前任者の顔写真など) - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://efcl.info/2018/06/21/can-npm-publish/">npm publishできるかを判定するコマンドラインツール: can-npm-publish | Web Scratch</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17425 2021-06-21T22:22:57+09:00 2021-06-21T22:22:57+09:00 https://crieit.net/posts/Node-js-GitHub-Actions 📝 Node.js パッケージを公開するための GitHub Actions を構築する <p><a target="_blank" rel="nofollow noopener" href="https://github.com/nikaera/react-emoji-textarea">react-emoji-textarea</a> の開発を行った際、<a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/github/administering-a-repository/releasing-projects-on-github/managing-releases-in-a-repository">リリース</a>を作成したら自動的に Node.js パッケージにライブラリが公開される仕組みがほしいと考え、GitHub Actions でそれを実現することにしました。</p> <p>その際、公式サイトに <a target="_blank" rel="nofollow noopener" href="https://docs.github.com/en/actions/guides/publishing-nodejs-packages#publishing-packages-using-yarn">公開されている内容</a> を参考に GitHub Actions を作成したのですが、そのまま利用すると私の環境では下記のエラーが発生してしまいました。</p> <pre><code class="bash">error Couldn't publish package: "https://registry.yarnpkg.com/@nikaera/react-emoji-textarea: You do not have permission to publish \"react-emoji-textarea\". Are you logged in as the correct user?" </code></pre> <p>上記のエラーについて調査しながら改修したところ、最終的に下記の GitHub Actions で Node.js パッケージを公開できるようになりました。<code>secrets.NPM_TOKEN</code> には <a target="_blank" rel="nofollow noopener" href="https://docs.npmjs.com/creating-and-viewing-access-tokens">NPM Token</a> を登録します。</p> <pre><code class="yml"># package.yml name: Node.js Package on: # workflow_dispatch を追加して手動でも実行できるよう改修 workflow_dispatch: release: types: [created] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: node-version: "14.x" registry-url: "https://registry.npmjs.org" # registry.npmjs.org へアクセスする際は必ず認証を試みるオプションを追加 always-auth: true # scope には自分のユーザ名を指定 scope: "@nikaera" # .npmrc に https://registry.npmjs.org アクセス時に利用する認証情報を記載する - run: echo "//registry.npmjs.org/:_authToken=$<span>{</span><span>{</span> secrets.NPM_TOKEN <span>}</span><span>}</span>" > ~/.npmrc - name: Build react-emoji-textarea 😆💖 run: | yarn install --frozen-lockfile yarn format yarn build - run: yarn publish --access public env: NODE_AUTH_TOKEN: $<span>{</span><span>{</span> secrets.NPM_TOKEN <span>}</span><span>}</span> </code></pre> nikaera