I believe that this already works, as I have one dependency in a
project where I am not able to do this because the maintainer
explicitly leaves the git version as `0.0.0` and applies the correct
version during their release process.

https://github.com/rzane/file_store/issues/24

-a

On Sat, Oct 23, 2021 at 3:03 PM 'Frerich Raabe' via elixir-lang-core
<elixir-lang-core@googlegroups.com> wrote:
>
> Hi all,
>
> specifying dependencies in `mix.exs` files via Git repositories could be made
> more powerful (and arguably reduce the need for self-hosted Hex repositories)
> by adding support for version requirements. To support this, Mix could
> automatically map Git tags to versions which can be consumed by the dependency
> resolution algorithm.
>
>
> Motivation
> ==========
>
> Declaring dependencies of Elixir projects via Git, e.g. by defining
>
>     {:foobar, git: "https://github.com/elixir-lang/foobar.git";, tag: "0.1"}
>
> is very convenient. In many cases, dependencies are already stored in Git
> repositories and (when working with private repositories) you get
> authentication for free (e.g. via SSH keys).
>
> However, there are at least two noteworthy downsides to this approach:
>
> 1. The dependency version is opaque: Mix has no idea which version of the
>    dependency is used, the value of the 'tag' option (resp. 'branch' or 'ref')
>    has no associated semantic as far as Mix is concerned. This makes life
>    harder for the dependency resolution algorithm.
>
> 2. The dependency version is overly specific: in the above example, we
>    expressed that we'd like a checkout of the repository as referencedb by the
>    '0.1' version tag. However, maybe *any* 0.1.x release is suitable (e.g.
>    0.1.1, 0.2.2 etc.). There is no way to express this, so bugfix releases 
> done
>    to the :foobar application won't get picked up when rebuilding our project.
>
> Thus, users tend to turn to private[1] or self-hosted[2] Hex repositories.
> Doing so allows defining a proper version requirement which is understood by
> Mix, e.g. "== 1.0". Alas, new Hex repositories come with their own challenges,
> such as
>
> * How are new package versions published: can you use `mix hex.publish` or do 
> you rather
>   copy plain tarballs around (cf. mix hex.registry build)
>
> * Where is the repository hosted, who maintains it?
>
> * How does authorization work, in case it is not desirable to have packages
>   available to everyone?
>
>
> Proposed Solution
> =================
>
> Much like Hex repositories, Many Git repositories already have a notion of
> 'versions', usually implemented via Git tags - Mix just doesn't make use of
> this. By making Mix fetch all release tags from the given repository, it could
> construct a set of available versions which could then be considered by the
> dependency resolution algorithm to select an appropriate version for the 
> build.
>
> For example, a dependency in the form of
>
>     {:foobar, git: "https://github.com/elixir-lang/foobar.git";, tag: "0.1"}
>
> could be rewritten as
>
>     {:foobar, "== 0.1", git: "https://github.com/elixir-lang/foobar.git"}
>
> In particular, this would enable using the powerful `~>` operator to express
> things such as 'the last stable 0.1.x' release:
>
>     {:foobar, "~> 0.1", git: "https://github.com/elixir-lang/foobar.git"}
>
> When defining a Git repository as a dependency like this, specifying the 
> `tag`,
> `branch` or `ref` options would be prohibited and result in a build time
> error (much as is already the case when specifying more than one of those
> three options).
>
> Adding this feature would alleviate the need to reach for self-hosted Hex
> repositories: the proven dependency resolution algorithm would kick in,
> enabling more flexible forms of specifying versions (via ~>) and allowing
> Mix to dynamically pick a matching version. Consequently, none of the
> challenges associated with using a self-hosted Hex repository need to be
> tackled.
>
>
> Implementation Considerations
> =============================
>
> Interaction With Other Git-Specific Options
> -------------------------------------------
> When defining a Git repository as a dependency using a version requirement,
> specifying the `tag`, `branch` or `ref` options would be prohibited and
> result in a build time error (much as is already the case when specifying
> more than one of those three options).
>
> Custom Tag Formats
> ------------------
> Many repositories use different tag formats than those which are understood by
> Version.parse/1[3]. Thus, it would be convenient to support an optional 
> mapping
> function of the form
>
>     String.t :: nil | Version.t
>
> which can be specified by the user to implement a custom mapping of Git tags 
> to
> Version structs (or `nil`, in case the given tag does not reference a released
> version).
>
> Maybe this optional mapping could be defined via an optional `tap_mapping:`
> option. For example, to process tags in the form `vX.Y.Z`:
>
>     {:foobar, "== 0.1", git: "https://github.com/elixir-lang/foobar.git";, 
> tag_mapping: &strip_leading_v/1}
>
>     def strip_leading_v("v" <> version) do
>       case Version.parse(version) do
>         {:ok, version} -> version
>         :error -> nil
>       end
>     end
>
>     def strip_leading_v(_), do: nil
>
> Efficiently Fetching Tags
> -------------------------
> The git-ls-remote[4] command permits fetching all (or just some) references
> from a remote repository without cloning the repository. Something like
>
>     git ls-remote --tags --refs https://github.com/elixir-lang/foobar.git
>
> can be used to get all tags in the given repository, based on which the set of
> all available versions could be constructed.
>
>
> I'd love to hear your thoughts on this!
>
> - Frerich
>
> [1]: https://hex.pm/docs/private
> [2]: https://hex.pm/docs/self_hosting
> [3]: https://hexdocs.pm/elixir/Version.html#parse/1
> [4]: https://git-scm.com/docs/git-ls-remote.html
>
> --
> You received this message because you are subscribed to the Google Groups 
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to elixir-lang-core+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/elixir-lang-core/7c961da0-b047-4e48-9df4-43e9eca99b0dn%40googlegroups.com.



-- 
Austin Ziegler • halosta...@gmail.com • aus...@halostatue.ca
http://www.halostatue.ca/http://twitter.com/halostatue

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAJ4ekQs%2B2%2BPKgZ9gr6HQ%3Denkz%3DxzSOzkKbD7EQcOExcg%2BWg1nQ%40mail.gmail.com.

Reply via email to