🔍

hex.infoコマンドを使ってパッケージの最新バージョンをサクッと確認する

2022/06/29に公開

erlang、elixirのパッケージマネージャーであるHexにはパッケージの公開や検索を行うためのコマンドが存在します。

mix hex で利用可能なコマンドの一覧が確認できます。

$ mix hex
Hex v1.0.1
Hex is a package manager for the Erlang ecosystem.

Available tasks:

mix hex.audit                                         # Shows retired Hex deps for the current project

mix hex.build                                         # Builds a new package version locally

mix hex.config                                        # Reads, updates or deletes local Hex config
mix hex.config KEY                                    # Get config value for KEY
mix hex.config KEY --delete                           # Delete config value for KEY
mix hex.config KEY VALUE                              # Set config KEY to VALUE

mix hex.docs fetch PACKAGE [VERSION]                  # Fetch documentation for offline use
mix hex.docs offline PACKAGE [VERSION]                # Open a browser window with offline documentation
mix hex.docs online PACKAGE [VERSION]                 # Open a browser window with online documentation

mix hex.info                                          # Prints Hex information
mix hex.info PACKAGE [VERSION]                        # Prints package information

mix hex.organization auth ORGANIZATION                # Authorize an organization
mix hex.organization deauth ORGANIZATION              # Deauthorize and remove organization
mix hex.organization list                             # List all authorized organizations
mix hex.organization key ORGANIZATION generate        # Generate organization key
mix hex.organization key ORGANIZATION revoke KEY_NAME # Revoke key
mix hex.organization key ORGANIZATION revoke --all    # Revoke all keys
mix hex.organization key ORGANIZATION list            # List keys

mix hex.outdated                                      # Shows outdated Hex deps for the current project
mix hex.outdated [APP]                                # Shows outdated Hex deps for the given dependency

mix hex.owner add PACKAGE EMAIL_OR_USERNAME           # Adds an owner to package
mix hex.owner transfer PACKAGE EMAIL_OR_USERNAME      # Transfers ownership of a package to another user or organization
mix hex.owner remove PACKAGE EMAIL_OR_USERNAME        # Removes an owner from package
mix hex.owner list PACKAGE                            # List all owners of a given package
mix hex.owner packages                                # List all packages owned by the current user

mix hex.package fetch PACKAGE [VERSION] [--unpack]    # Fetch the package
mix hex.package diff APP VERSION                      # Diff dependency against version
mix hex.package diff PACKAGE VERSION1 VERSION2        # Diff package versions
mix hex.package diff PACKAGE VERSION1..VERSION2       # Diff package versions

mix hex.publish                                       # Publishes a new package version
mix hex.publish package                               # Publish current package
mix hex.publish docs                                  # Publish current docs
mix hex.publish package --revert VERSION              # Reverts package on given version
mix hex.publish docs --revert VERSION                 # Reverts docs on given version
mix hex.publish --revert VERSION                      # Reverts given version

mix hex.registry build PUBLIC_DIR                     # Build a local registry

mix hex.repo add NAME URL                             # Add a repo
mix hex.repo set NAME                                 # Set config for repo
mix hex.repo remove NAME                              # Remove repo
mix hex.repo show NAME                                # Show repo config
mix hex.repo list                                     # List all repos

mix hex.retire PACKAGE VERSION REASON                 # Retires a package version
mix hex.retire PACKAGE VERSION --unretire             # Unretires a package

mix hex.search PACKAGE                                # Searches for package names

mix hex.sponsor                                       # Show Hex packages accepting sponsorships

mix hex.user register                                 # Register a new user
mix hex.user whoami                                   # Prints the current user
mix hex.user auth                                     # Authorize a new user
mix hex.user deauth                                   # Deauthorize the user
mix hex.user key generate                             # Generate user key
mix hex.user key revoke KEY_NAME                      # Removes given key from account
mix hex.user key revoke --all                         # Revoke all keys
mix hex.user key list                                 # Lists all keys associated with your account
mix hex.user reset_password account                   # Reset user account password
mix hex.user reset_password local                     # Reset local password


Further information can be found here: https://hex.pm/docs

mix local.hex でコマンドのインストール、または更新ができます。

$ mix local.hex

これらのコマンドをあまり使ったことはなかったのですが、hex.info コマンドが地味に使えそうだったため紹介します。

mix hex.info

mix hex.info で指定したパッケージの情報が取得できます

https://hexdocs.pm/hex/Mix.Tasks.Hex.Info.html

$ mix hex.info credo
A static code analysis tool with a focus on code consistency and teaching.

Config: {:credo, "~> 1.6"}
Releases: 1.6.4, 1.6.3, 1.6.2, 1.6.1, 1.6.0, 1.6.0-rc.1, 1.6.0-rc.0, 1.5.6, ...

Licenses: MIT
Links:
  Changelog: https://github.com/rrrene/credo/blob/master/CHANGELOG.md
  GitHub: https://github.com/rrrene/credo

何が嬉しいかというと、 Config の行にdepsに指定する形式で表示されているため、これをgrepすれば deps にそのまま使えます。

$ mix hex.info credo | grep Config | cut -d" " -f2-
{:credo, "~> 1.6"}

あとはこれを mix.exs に貼り付ければ依存の追加ができます。雑にmix projectを作って検証する場合などに便利です。

余談:deps.add コマンドは公式にサポートされないのか?

「公式で deps.add コマンドをサポートしないの?」という疑問が湧いてきますが、以下のスレッドがありました。

https://elixirforum.com/t/why-doesnt-the-elixir-core-team-accept-mix-deps-add-proposals/40627/13

確かにオフィシャルにあっても良さそうなのですが、依存に関してはjsonやyamlなど決まったフォーマットではなく単なるコードなので、どこに追加すべきか判断がつかないため実装は行わないようです。

たとえばecto_sqlプロジェクトのdepsだと関数を駆使して記述されています。これだと確かに追加しようがないですね。

https://github.com/elixir-ecto/ecto_sql/blob/b77fcb0d003dc7ff30d608d1a44148d03af3e8f8/mix.exs#L53

defp deps do
    [
      ecto_dep(),
      {:telemetry, "~> 0.4.0 or ~> 1.0"},

      # Drivers
      {:db_connection, "~> 2.5 or ~> 2.4.1"},
      postgrex_dep(),
      myxql_dep(),
      tds_dep(),

      # Bring something in for JSON during tests
      {:jason, ">= 0.0.0", only: [:test, :docs]},

      # Docs
      {:ex_doc, "~> 0.21", only: :docs},

      # Benchmarks
      {:benchee, "~> 0.11.0", only: :bench},
      {:benchee_json, "~> 0.4.0", only: :bench}
    ]
  end

  defp ecto_dep do
    if path = System.get_env("ECTO_PATH") do
      {:ecto, path: path}
    else
      {:ecto, "~> 3.9.0-dev", github: "elixir-ecto/ecto"}
    end
  end

  defp postgrex_dep do
    if path = System.get_env("POSTGREX_PATH") do
      {:postgrex, path: path}
    else
      {:postgrex, "~> 0.15.0 or ~> 0.16.0 or ~> 1.0", optional: true}
    end
  end

  defp myxql_dep do
    if path = System.get_env("MYXQL_PATH") do
      {:myxql, path: path}
    else
      {:myxql, "~> 0.6.0", optional: true}
    end
  end

  defp tds_dep do
    if path = System.get_env("TDS_PATH") do
      {:tds, path: path}
    else
      {:tds, "~> 2.1.1 or ~> 2.2", optional: true}
    end
  end

過去にPRも上がっていますがCLOSEされており、対応はないでしょう。

https://github.com/elixir-lang/elixir/pull/10291

更新はかなり古いですが、非公式で deps.add コマンドを導入するarchiveもあったりします。参考まで。

https://github.com/bryanstearns/mix_deps_add

まとめ

hex.info コマンドについて紹介してみました。他にも hex.search でhexからキーワード検索できるなど、色々と知らないコマンドがありました。関心のあるキーワードを入れてみて検索結果を片っ端から見ていくなどしても面白そうですね。興味のある方は試してみてください。

Discussion