Suggestion for DUB users: The vanity package
WebFreak001
d.forum at webfreak.org
Tue Oct 19 14:36:17 UTC 2021
On Tuesday, 19 October 2021 at 04:03:38 UTC, Mathias LANG wrote:
> I was looking at a few packages recently, and noticed a
> bothering trend: Single-module libraries ending up at the top
> level.
>
> Why is it bothering ? Well, here's a little puzzle: Does the
> following code compile?
> ```D
> import std.stdio;
>
> void main ()
> {
> writeln(foo.stringof);
> }
> ```
>
> The answer is "maybe". In most case, it will not. However, if
> the file this resides in is named `foo.d`, it will compile.
> Because the module name accounts for an identifier that can be
> addressed in the scope of the module (and other modules that
> import it).
>
> Now imagine what would happen if `core.atomic` or `core.time`
> were top-level modules ? Conflicts, conflicts everywhere. It
> only gets worse with imports, as `import atomic;` would insert
> the `atomic` name into the current scope, which would then
> shadow any symbol named `atomic` in any import (there used to
> be an evil hack in the compiler to make this special case work
> - it is gone since a few releases).
>
> So what's the solution ? Well we could go with the Java-esque
> `com.foo`, but that'd be a bit ridiculous. Instead, for a few
> years now, I have started a habit of using the "vanity
> package", a top-level package with my username, for simple
> libraries I publish:
> -
> https://github.com/Geod24/bitblob/blob/v2.2.0/source/geod24/bitblob.d#L16
> -
> https://github.com/Geod24/localrest/blob/ddfa8cd3bc2f48e1dfc5edd803b990e5aaa69044/source/geod24/LocalRest.d#L102
> -
> https://github.com/Geod24/minivariant/blob/d20b240d45289a857b4c0d6e7f842a92b3d4a19e/source/geod24/variant.d#L30
>
> It "just works", is pretty simple to remember, easily
> extendable, and you can be pretty sure no user of your library
> will run into conflicts. I encourage anyone considering
> publishing a package to do the same.
I like this idea. We should put this on the dub documentation to
make more users do this.
I'm not opposed to the Java style either though. (at least for me
that would be org.webfreak instead of webfreak)
However some projects are quite generic, I think having some
common idiom there like calling generic packages `util.atomic` or
`util.money` would be good. Of course there might be name
clashing with this, but it's unlikely to happen in the same
project depending on them because packages with the same name are
usually competing packages and not packages you would use
together. In the case you do have an issue with overlapping
package names you could make dub wrapper packages as well.
More information about the Digitalmars-d
mailing list