project-ideas icon indicating copy to clipboard operation
project-ideas copied to clipboard

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

Open wilzbach opened this issue 4 years ago • 6 comments

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

Rating

Medium

Project Type

Infrastructure/Automation

Point of Contact/Possible Mentors

@wilzbach @maxhaton

References

  • https://stephencoakley.com/2019/04/24/how-rust-solved-dependency-hell

wilzbach avatar Aug 10 '19 17:08 wilzbach