Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using a local clone.

Import path binding

Version 1
Created 2011-10-18
StatusDraft
Last modified 2011-10-18
Author Martin Nowak

Abstract

Allow to use specific import paths for selected modules or packages.

Rationale

The proposal increases the flexibility of directory layouts w.r.t. the package system. It decouples the package hierarchy from a fixed directory layout. It is a requirement to do virtual imports based on URLs.

Description

The feature is implemented by augmenting the syntax for imports. Currently, the D import path is specified either via command line through the -I switch, or via the dmd.conf (dmd.ini) file.

The path given via the command line or configuration file will now be of the form:

  [module.or.package=]

When the (“module.or.package=”) part is given this is referred to as a qualified import path.

Usage

A qualified import path specifies that the given path will ONLY be used if the module being imported begins with or is exactly the given module. The ‘path’ takes the place of the module or package path when finding a physical resource. The package qualifier must be exact, for example, if a path given is

   -Ia.b=/home/ab

and someone imports a.bc, this does not match. If a modules matches a qualified import path and the given import cannot be found using that path, the compiler generates an error. This is to prevent cases where the module is found in an alternative path.

If path is a symlink it will be resolved as is done for unqualified import paths.

Examples

   module a;        import foo.bar;        void main()    {    }        dmd a.d -Ifoo=/path/D/foo           => /path/D/foo/bar.{d|di} is read as module foo.bar.    dmd a.d -Ifoo.bar=/path/D/foobar.d  => /path/D/foobar.d is read as module foo.bar.    dmd a.d -Ifoo.baz=/path/foo/baz     => bar.{d|di} is not being searched in /path/foo/baz    dmd a.d -Ifoo.bar=/path/src.ext     => error src.ext is not a d source file    dmd a.d -Ifoo.bar=/path/null/bar.d  => error source file does not exist    dmd a.d -Ifoo=/path/foo             => error if /path/foo/bar.{d|di} is not a file

Hijack Prevention

The compiler will produce an error if you specify two package qualifiers where one is the prefix of another. For example:

   -Ia.b=/home/ab    -Ia=/home/a

This is to prevent ambiguity of where a certain module exists. It is still possible to define multiple import paths for a module if the package qualifier is not used. In this case, the behavior is the same as the current compiler.

Impact

This does not conflict with the current import path spec. It will break assumptions on having a corresponding directory layout for the package hierarchy.

This document has been placed in the Public Domain.