On Wednesday, 26 October 2016 at 07:57:57 UTC, Mike Parker wrote:
On Wednesday, 26 October 2016 at 07:14:30 UTC, Jeff Thompson wrote:


dmd -I/commit_b3bf5c7725c98ee3e49dfc4e47318162f138fe94/version/ main.d dmd -I//commit_df0741a84c8a967ea08674090afdff4e9a58d23e/version/ main.d

This will force the application to use either one version or the other. As I said, it's a large application. I different parts of the same application to be able to import the version they need.

A module named foo.bar is foo.bar. There's no way to have a foo.bar version1 and a foo.bar version2 in the same program. You compile and link one version or the other, period. If you want multiple versions in the same program, then they need to have distinct module names:

foo/bar1.d --> module foo.bar1;
foo/bar2.d --> module foo.bar2;

I can't see how you would expect it to work otherwise. How would the compiler know that a call to foo.bar.someFunc belongs to one version or another if both have the same fully qualified name?

Or maybe I'm misunderstanding you (and I'm apparently not the only one in this thread). What problem are you trying to solve? Why do you need different versions of the same module or package at the same time in the same program?

I need different versions of the same module at the same time in the same program to be able to use multiple libraries, some of which have been verified to work one version of the module and others to work with another version. It is to be able to have reliability in large scale programs where different libraries have slightly different dependencies.

I can do this in Node.js. Suppose I have the following files:

commit_b3bf5c7/utils.js
commit_df0741a/utils.js
somelib.js
anotherlib.js

In Node.js, somelib.js can have

var Utils = require('commit_b3bf5c7/utils.js').Utils;

And anotherlib.js can have

var Utils = require('commit_df0741a/utils.js').Utils;

with no conflict whatsoever. Each lib can use the version that it knows works correctly. A file can even include both if it needs to:

var Utils1 = require('commit_b3bf5c7/utils.js').Utils;
var Utils2 = require('commit_df0741a/utils.js').Utils;

Again no conflict between using Utils1 and Utils2. The point is that the namespace of the identifiers of imported files is defined by the file that imports it. This allows much more scalability, instead of forcing every library and every library it depends on to use the same version of an imported file.

Reply via email to