Thanks Kevin, that's a great answer! Along with Jameson's explanation of 
the difference between include() and require(), I now have a much better 
understanding of these things. 

The only outstanding question as far as I am concerned is: is there a good 
use case for Pkg.clone("github/fork/url/Galaxy.jl.git", "GalaxyBlue")? I 
find it misleading that you are given an option to change the package name 
in a way which will always (most of the time?) break ulterior "import" / 
"using", unless you manually change the name of the source file Galaxy.jl 
-> GalaxyBlue.jl. But maybe I am failing to imagine a situation where this 
is useful.

(I am continuing discussion about the pull request directly on github's 
corresponding issue.)
 
On Saturday, March 8, 2014 6:02:30 PM UTC-5, Kevin Squire wrote:
>
> Hi Ben, 
>
> On Fri, Mar 7, 2014 at 11:02 AM, ben <[email protected] 
> <javascript:>>wrote:
>
>> Thanks, John. 
>>
>> I am still a little confused:
>>
>> (1) Does the main module of a package have to be named like the package?
>>
>
> No, but when you type "using Pkg" or "import Pkg", Julia looks first in 
> the the current directory for Pkg.jl, and if not there, it searches the 
> package directory ($HOME/.julia/v0.3), and the LOAD_PATH for the 
> following:
>
> 1. Pkg.jl
> 2. Pkg/src/Pkg.jl
> 3. Pkg.jl/src/Pkg.jl
>
> (The relevant lines are at the beginning of 
> https://github.com/JuliaLang/julia/blob/master/base/loading.jl.)
>
>  So if you rename the package and then try to use "using MyPkg" or "import 
> MyPkg", Julia will be looking for the wrong package name.  You can get 
> around this with
>
> require("GalaxyBlue/src/Galaxy.jl")   
> # or require("GalaxyBlue/src/Galaxy") -- the .jl is optional
> using Galaxy  # Finds the Galaxy module you just required
>
>
> I've opened up an issue to clarify this (
> https://github.com/JuliaLang/julia/issues/6082).
>  
>
>> (2) What is the priority of modules/packages when, eg, calling `import 
>> Galaxy` if there is both a package and a module named Galaxy (see example 
>> below)?
>>
>
> This should hopefully be clarified by the answer to (1) above.
>  
>
>> (3) What is the correct use of import/using/require? 
>>
>
> Some of this is described here:
>
> http://julia.readthedocs.org/en/latest/manual/modules/
>
> although it should probably be updated.
>
> Briefly:
> 1. "using MyModule" imports all of the exported functions of MyModuleinto the 
> current namespace
> 2. "import MyModule" imports the module name; functions can be called 
> with "MyModule.fn(x,y)"
> 3. "import MyModule: fn1, fn2" imports the functions "fn1" and "fn2" into 
> the current namespace
> 4. "require("somefile.jl")" loads a particular file.  This is useful when:
>
>   a. you have a script or some bare function definitions you wish to 
> load/execute from another file or at the REPL
>   b. a file defines a module with a different name than the filename (as 
> in my answer to #1 above)
>
>  
>
>> (4) What is the point of the (documented) syntax 
>> `Pkg.clone("github/fork/url/Galaxy.jl.git", "GalaxyBlue")`? Is it 
>> deprecated? Is it exactly equivalent to a git clone from terminal?
>>
>
> Pkg.clone("http://github.com/myid/SomePackage.jl";) is meant to clone a 
> package that might not be in the official list.  It is equivalent to git 
> clone in the Julia package directory, with the only difference that it 
> strips ".jl" from the name (but Julia will find the package contents either 
> way--see the answer to 1 above).
>
> I'm not familiar with the second parameter, but I assume it does what you 
> ask.
>  
>
>>
>> Here is an example which can happen in practice and which is very unclear 
>> to me:
>>
>> [Package Galaxy]
>> module Galaxy
>>   (stuff)
>>   module Star
>>     using Galaxy
>>     (stuff)
>>   end
>> end
>>
>> [Forked Package GalaxyBlue]
>> module Galaxy
>>   (stuff)
>>   module Star
>>     using Galaxy              <-------------------------------- what 
>> happens here? is it going to use the forked version or load the package 
>> Galaxy?
>>     (stuff)
>>   end
>> end
>>
>
>
> Testing:
>
> kevin@IsiahThomas:~/.julia/v0.3$ find Galaxy
> Galaxy
> Galaxy/src
> Galaxy/src/Galaxy.jl
> kevin@IsiahThomas:~/.julia/v0.3$ cat Galaxy/src/Galaxy.jl
>
> module Galaxy
> println("Galaxy")
> end
>
> kevin@IsiahThomas:~/.julia/v0.3$ julia -e 'using Galaxy'
> Galaxy
> kevin@IsiahThomas:~/.julia/v0.3$ find GalaxyQuest
> GalaxyQuest
> GalaxyQuest/src
> GalaxyQuest/src/Galaxy.jl
> kevin@IsiahThomas:~/.julia/v0.3$ cat GalaxyQuest/src/Galaxy.jl
> module Galaxy
> export galaxy
> galaxy() = "Milky Way"
>
> module Star
> using Galaxy
> println(Galaxy.galaxy())
> end
>
> end
>
> kevin@IsiahThomas:~/.julia/v0.3$ julia -e 
> 'require("GalaxyQuest/src/Galaxy"); using Galaxy.Star'
> Milky Way
>
> This is what would be expected, actually, since the Galaxy definition is 
> already loaded.  No magic.  If the module definition exists, it's used.
>  
> Hope this is helpful!
>
> (If you wanted to take this answer and update the documentation, a pull 
> request would be very much appreciated.)
>
> Cheers,
>
>    Kevin
>
>
>
>
>> (I found a somewhat related discussion here:
>> https://groups.google.com/forum/#!topic/julia-users/5TAUsNfZmqE 
>> )
>>
>> Ben
>>
>>
>>
>>
>> On Tuesday, February 25, 2014 11:28:40 AM UTC-5, John Myles White wrote:
>>
>>> I think the core insight is that a package has two components: 
>>>
>>> (1) A module called GalaxyBlue 
>>> (2) A file, in a searchable package directory like Pkg.dir(), that’s 
>>> called something like GalaxyBlue/src/GalaxyBlue.jl. 
>>>
>>> For 2, that means you have a directory (usually a repo) containing the 
>>> package code, a subdirectory called src and then a file called 
>>> PACKAGENAME.jl, which will be automatically loaded. That file should 
>>> contain the definition of your module. 
>>>
>>> I’m not sure, but I suspect that Pkg.clone with a second argument isn’t 
>>> changing the content of that file. 
>>>
>>>  — John 
>>>
>>> On Feb 25, 2014, at 7:01 AM, ben <[email protected]> wrote: 
>>>
>>> > Hi, 
>>> > 
>>> > Is it possible for two different packages to contain identically named 
>>> modules? 
>>> > 
>>> > For instance, if I fork a package Galaxy.jl, and then 
>>> > 
>>> > > Pkg.clone("github/fork/url/Galaxy.jl.git", GalaxyBlue) 
>>> > 
>>> > (So that both the original package and my forked version live 
>>> side-by-side in my .julia repository.) How do I then use GalaxyBlue? "using 
>>> GalaxyBlue" and "require("GalaxyBlue")" both give me "ERROR: GalaxyBlue" 
>>> not found. 
>>> > 
>>> > I guess I am generally confused about package names v. module names 
>>> and I was not able to find documentation on this. 
>>> > 
>>> > Thanks! 
>>> > 
>>> > Ben 
>>>
>>>
>

Reply via email to