Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Solve dependency hell: link with more than one versions of the same project #51

Open
wilzbach opened this issue Aug 10, 2019 · 0 comments

Comments

@wilzbach
Copy link
Member

commented Aug 10, 2019

Description

Let's see that in project X you use an XML parser of v1. This XML parser depends on a collections library with v1. Now, however, the team decides to a add a JSON parser too, but this one depends on a newer version of the collections library with v2. The result is that the team can't use the JSON parser in their project and currently the only viable strategies are:

  • copy/paste the collections library to a new namespace and let the JSON parser depend on this new collections namespace
  • try to upgrade the XML parser to v2

(1) is very cumbersome, requires a lot of manual work and makes it hard to sync up with upstream. (2) is often not possible.

Hence, the aim of this project is to allow people to use v1 and v2 of collections in parallel in their dub projects. Rust allows to fix this dependency hell problem by appending a unique suffix to each symbol of the conflicting versions. This works as long as each dependency only uses one direct version of a dependency. This is a very reasonable assumption and this approach should work for D too.

What are rough milestones of this project?

  1. investigate solutions used in other languages or active research
  2. create two DMD PR
    • to allow it to append unique suffixes to all generated symbols (e.g. --mangle-suffix=v1.1)
    • to map unique suffixes to used symbols (e.g. --mangle-suffix-map=json:v1.1)
  3. add the respective CLI flags to all dub invocations (be sure only to do so if frontend >= X)
  • solve a small minimal example
  1. only add CLI flags to dub dmd invocations when they are required (e.g. SemVer conflict)
  • create more test cases
  1. open DUB PR
  2. get DUB PR merged
  • make sure it passes on all CIs
  • address review

Optional improvements:

  • allow the user to completely disable this behavior and error when an unsolvable conflict has been found (= revert to current behavior)
  • allow to user to declare the exact semver multi-mapping in his/her's project config

How does this project help the D community?

It is a first milestone and a requirement to moving the standard library Phobos to Dub. Additionally, it will have a massive impact on the D community as any bigger D project that has a non-trivial amount of dependencies runs into a dependency hell.

Recommended skills

  • medium experience with D
  • experience with a package manager
  • understanding of the linking process
  • no fear of the DMD frontend

What can students expect to get out of doing this project?

  • learn about D's name mangling system
  • learn how D packages are built
  • create and integrate a high-impact project for the D community

Point of Contact

@wilzbach

References

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
2 participants
You can’t perform that action at this time.