Stop untracked dependencies!
S. Alexander Jacobson
alex at alexjacobson.com
Tue Apr 5 15:54:39 EDT 2005
Simon says:
> I'm afraid it's the same thing, because packages are indivisible.
In other words, packages should be minimal sets of mutually
interdependent modules. This fact combined with no-grafting rule's
global module namespace implies that the whole notion of build-depends
or package files is a mistake!
Module names map directly to sets of project locations via some
community consensus. And user visible package names are just
overhead.
We just need a way for a community to resolve module names to package
locations. Ideally, this would be a standard protocol by which
haskell implementations can do such lookups of package URLs against a
set of known module name servers.
Strawman protocol 1: Define a new DNS record, URL, and define some
translation of module names into domain names.
Strawman protocol 2: Use HTTP/HTTPS and define a query syntax such as
GET ResolverURL/moduleName and use 30x headers for redirection to the
appropriate server.
Thoughts?
-Alex-
______________________________________________________________
S. Alexander Jacobson tel:917-770-6565 http://alexjacobson.com
On Mon, 4 Apr 2005, Simon Marlow wrote:
> On 01 April 2005 20:31, S. Alexander Jacobson wrote:
>
>> If we are in agreement about the overall goal, then I'll move on to
>> the specific issues that need addressing:
>>
>> * We Need Free Packaging
>>
>> Anyone should be able to create a package at any time for use in their
>> projects without having having to negotiate with any particular
>> centralized authority or community.
>
> Absolutely! I suggested that URLs should be valid package names before,
> and I still think that's a reasonable solution.
>
> Using Hackage will be completely optional. No-one is about to tell you
> how and where you can distribute your own packages.
>
>> * Free Packaging Means We To Handle Collisions in Module Namespace
>>
>> Anyone should be able to use any combination of packages they want in
>> any of their programs at any time without worrying about whether those
>> packages export the same module name.
>>
>> Simon says:
>>> We don't allow programs to contain two modules with the same name,
>>> for good reasons.
>>
>> I'm not asking for that. I am totally ok with each module name
>> mapping to one and only one implementation per program. I just want
>> to be able choose that implementation even when my program uses two
>> packages that both happen to export the same module name.
>
> I'm afraid it's the same thing, because packages are indivisible.
> Packages are indivisible for two reasons:
>
> - modules within a package depend on each other. If you need one,
> you need all its dependencies too. Packages don't tell you what
> their inter-module dependencies are. That's part of the reason
> for having packages: to decrease the granularity of dependencies.
>
> - technical reasons: a package may be shipped as a shared library,
> which is indvisible and populates the global symbol table with
> all of its symbols. You can't pick and choose which ones you
> want. (static libraries allow a kind of shadowing, but it would
> also lead to problems I think).
>
> So to do what you're asking for, we'd have to support overlapping
> modules. I agree with your reasoning for wanting to be able to do this:
> we need as much freedom to be able to combine packages from third
> parties as possible. Unfortunately, it requires a non-trivial
> technological leap.
>
>> * We Need to Associate Module Names with Specific Packages
>
> You could specify the connection between modules and packages if you
> want. Given that you can't use two packages containing the same module,
> the information would be redundant (apart from documentation) right now.
>
>> * Default Exposed Packages Are Untenable
>>
>> Although, I agree that fussing with a -packages command line is
>> annoying, the need to associate module names with packages ids
>> makes the existing default exposed package compromise untenable.
>>
>> But, all is not lost! If you choose (c) above, nothing stops you from
>> having a default global "Packages" file. Then your marginal work is
>> just to supply a package name in your import statements e.g.:
>>
>> import HaXML HaXML.XML.Parse
>
> Your global "Packages" file is a source of untracked dependencies, isn't
> it? Don't I have to provide that file with every scrap of source code I
> publish? How do I merge someone else's Packages file with mine? In
> what way is it better than specifying dependencies in a .cabal file
> which is already shipped with a package?
>
> Also, the Haskell module hierarchy is supposed to reflect functionality,
> whereas package names are purely administrative. This is a reason for
> not including package names in source code.
>
> There are some other administrative details which amount to
> dependencies, and which are tracked by .cabal files but not by your
> proposal:
>
> - language extensions
> - include paths
> - library paths
> - C library dependencies
> etc.
>
> some of these you can put in {-# GHC_OPTIONS #-}, but not all. And in
> any case you probably want to specify them once per package, not once
> per module.
>
>> * In Any Case, Default Exposed Packages Are Also a Poor Compromise.
>>
>> I don't want to have to worry about accumulating untracked dependcies
>> when I am doing quickie work with GHCi. I want my dependencies
>> checked every step of the way and should not have to round trip
>> through a Cabal packaging step just to verify them.
>
> Your dependencies are still untracked. But anyway, I see the point. If
> you want package dependencies checked as you write source code, here are
> a couple of possibilities:
>
> - GHC could have a checked pragma on each import, eg:
>
> import {-# PACKAGE base >= 1.0 #-} Data.List
>
> I don't want to write these in my source code personally,
> but it would be easy enough to implement. It could be
> made mandatory, optionally.
>
> Or:
>
> - GHCi could have a Cabal front end. i.e. you give GHCi a
> .cabal file instead of specifying source files directly,
> and it checks dependencies. This is easy enough to
> implement too.
>
> In both cases you would have to restart GHCi if you made use of a
> non-exposed package, thoughl.
>
>> * Conclusion: Freedom is good.
>
> No argument from me on that one!
>
> Cheers,
> Simon
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries
>
More information about the Libraries
mailing list