DIP11: Automatic downloading of libraries
Steven Schveighoffer
schveiguy at yahoo.com
Wed Jun 15 20:32:13 PDT 2011
On Wed, 15 Jun 2011 23:23:43 -0400, Ary Manzana <ary at esperanto.org.ar>
wrote:
> On 6/15/11 8:33 PM, Steven Schveighoffer wrote:
>> On Tue, 14 Jun 2011 09:53:16 -0400, Andrei Alexandrescu
>> <SeeWebsiteForEmail at erdani.org> wrote:
>>
>>> http://www.wikiservice.at/d/wiki.cgi?LanguageDevel/DIPs/DIP11
>>>
>>> Destroy.
>>
>> I put this as replies in several threads, but I'll throw it out there as
>> its own thread:
>>
>> * You already agree that having the fetching done by a separate program
>> (possibly written in d) makes the solution cleaner (i.e. you are not
>> infiltrating the code that actually does compiling with code that does
>> network fetching).
>>
>> * I think specifying the entire url in the pragma is akin to specifying
>> the full path of a given module on your local disk. I think it's not the
>> right place for it, the person who is building the code should be
>> responsible for where the modules come from, and import should continue
>> to specify the module relative to the include path.
>>
>> * A perfect (IMO) way to configure the fetch tool is by using the same
>> mechanism that configures dmd on how to get modules -- the include path.
>> For instance -Ihttp://xxx.yyy.zzz/package can be passed to the compiler
>> or put into the dmd.conf.
>>
>> * DMD already has a good mechanism to specify configuration and you
>> would barely have to change anything internally.
>>
>> Here's how it would work. I'll specify how it goes from command line to
>> final (note the http path is not a valid path, it's just an example):
>>
>> dmd -Ihttp://www.dsource.org/projects/dcollections/import testproj.d
>>
>> 1. dmd recognizes the url pattern and stores this as an 'external' path
>> 2. dmd reads the file testproj.d and sees that it imports
>> dcollections.TreeMap
>> 3. Using it's non-external paths, it cannot find the module.
>> 4. It calls:
>> dget -Ihttp://www.dsource.org/projects/dcollections/import
>> dcollections.TreeMap
>> 5. dget checks its internal cache to see if the file
>> dcollections/TreeMap.[d|di] already exists -- not found
>> 6. dget uses internal logic to generate a request to download either
>> a. an entire package which contains the requested import (preferred)
>> b. just the specific file dcollections/TreeMap.d
>> 7. Using the url as a key, it stores the TreeMap.d file in a cache so it
>> doesn't have to download it again (can be stored globally or local to
>> the user/project)
>> 8. Pipes the file to stdout, dmd reads the file, and returns 0 for
>> success
>> 9. dmd finishes compiling.
>
> So if I have a library with three modules, a.d, b.d, c.d, which depend
> on another library, I should put that pragma(importpath) on each of them
> with the same url?
With the updated proposal (please see the DIP now), you can do -I to
specify the import path on the command line. Otherwise, yes, you have to
duplicate it.
> Or maybe I could create a fake d file with that pragma, and make the
> three modules import it so I just specify it once.
As long as the fake d file imports the files you need publicly, it should
be pulled in, yes. But the import pragma only affects imports from the
current file. I think that seems right, because you don't want to worry
about importing files that might affect your import paths. I look at it
like version statements.
-Steve
More information about the Digitalmars-d
mailing list