项目的创建与引入

             

贡献者: xzllxls

   本文授权转载自郝林的 《Julia 编程基础》.原文链接:第 2 章:编程环境

2.3 项目的创建与引入

   到目前为止,我们已经对 Julia 的项目环境有了一定的了解,并讨论了仓库目录、程序包存储目录和环境配置这几个重要的概念.

   项目的环境配置一般由项目文件 Project.toml 和清单文件 Manifest.toml 体现.全局环境配置针对的是 REPL 环境中的代码和独立的 Julia 程序.该环境配置的文件通常会在 ~/.julia/environments 目录的特性版本子目录(如 v1.3)中.

   我们已经学会了在全局环境中怎样安装和导入程序包.这对于编写和部署一些脚本程序来说已经足够了.不过,我们在正式开发 Julia 项目的时候往往还需要专属的环境配置文件.这样才能与全局环境区别开.这么做有 3 个好处:

  1. 一旦有了专属的环境配置文件,我们的项目就可以独立地管理依赖包了.
  2. 针对某个 Julia 项目的程序包管理操作不会影响到全局的环境配置.反之亦然.
  3. 拥有环境配置文件的 Julia 项目可以为项目的分发(以供他人使用)做好准备.

   换句话说,我们的 Julia 项目可以因此成为独立的、可重用的以及对分发友好的项目.

   2.3.1 项目的创建

   创建一个 Julia 项目很容易,在 REPL 环境中就可以办到.我们先在命令行中通过输入 julia 命令进入到 REPL 环境.然后,我们在它的 shell 模式中进入某个专用的目录(比如 ~/Projects),就像这样:

shell> cd ~/Projects/
/Users/haolin/Projects

julia>

   这时,我们可以再确认一下当前的目录:

julia> pwd()
"/Users/haolin/Projects"

julia>

   这里的 pwd 是 Print Working Directory 的缩写.所以,pwd 函数的含义就是打印当前的工作目录.这与在命令行中输入 pwd 命令的作用是类似的.只不过调用表达式 pwd() 的求值结果是一个字符串.

   在确认了工作目录之后,我们就可以切换到 REPL 环境的 pkg 模式,然后输入 generate 命令,并后跟一个空格和项目的名称 Programs(你也可以用别的名字):

(v1.3) pkg> generate Programs
Generating project Programs:
    Programs/Project.toml
    Programs/src/Programs.jl

(v1.3) pkg>

   注意,我在 generate 命令后面追加的参数是我们要创建的 Julia 项目的名称.随后,这个命令创建了一个名为 Programs 的目录,并在该目录下生成了两个文件.一个是项目文件 Project.toml,另一个是 src 目录(即源码目录)下的源码文件 Programs.jl

   我们先来看项目文件,它的内容如下:

% [language=markdown]
name = "Programs"
uuid = "e525bb1a-bb1e-11e9-07f5-1125a61c95e2"
authors = ["robert.hao <hypermind@outlook.com>"]
version = "0.1.0"

   这里有 4 个条目,分别代表项目的名称、UUID、作者信息和初始版本号.其中的 UUID 是 Julia 的程序包管理器自动生成的.而项目作者信息是从当前操作系统中的 Git 配置信息复制过来的.

   我们再来看源码文件 Programs.jl 的内容:

module Programs

greet() = print("Hello World!")

end # module

   其中只定义了一个名为 Programs 的模块.并且,该模块仅包含了一个可以向计算机的标准输出打印 Hello World! 的函数 greet.这显然只是一个简单的程序模板.不过,它为我们后续的编码开了个头.

   注意,这个源码文件是有重要意义的:

   1. 该文件可以被称为 Programs 项目的源码入口.或者说,它是这个项目的主源码文件.这是由于该文件的主文件名与项目的(主)名称是一致的. 2. 该文件中定义的(最外层的)模块 Programs 将会是其所属项目的主模块(或者说默认模块).这是由于该模块的名称与项目的(主)名称是一致的.

   正因为有了这样的一个源码文件,使得 Programs 项目可以被 Julia 视为一个程序包.更明确地讲,如果存在一个名为 XX.jl 的 Julia 项目,只要该项目包含一个相对路径为 src/X.jl 的源码文件,并且在该文件中定义的最外层模块名为 X,那么它就是一个有效的程序包.

   最后,一个可选的操作是,我们可以把这个项目的名称变更为 Programs.jl.如此可以让它更具 Julia 项目的特色.由前述内容可知,这样做并不会妨碍此项目成为一个有效的程序包.注意,项目 Programs.jl 所代表的程序包的名称依然是 Programs,同时它的主模块的名称也依然是 Programs

   2.3.2 程序包的引入

   既然 Programs.jl 项目已经是一个有效的程序包了,那么我们就可以在代码中对它进行引入(更明确地说,是引入它的主模块 Programs).具体怎么做呢?

   当我们试图在全局环境中导入该程序包的时候,Julia 会提示找不到这个程序包:

julia> import Programs
ERROR: ArgumentError: Package Programs not found in current path:
- Run `import Pkg; Pkg.add("Programs")` to install the Programs package.

Stacktrace:
 [1] require(::Module, ::Symbol) at ./loading.jl:887

julia>

   为了解决这个问题,我们可以先在 REPL 环境下进入到 Programs.jl 项目所在的目录,然后切换到 pkg 模式,并输入命令 activate ..注意,这里的输入是 activate 加一个空格" ",再加一个英文点号".".示例如下:

shell> cd ~/Projects/Programs.jl
/Users/haolin/Projects/Programs.jl

(v1.3) pkg> activate .

(Programs) pkg>

   我们可以看到,在使用 activate 命令之后,REPL 环境的提示符再次改变了,变成了当前程序包的名称 Programs,也就是在当前目录下的 Project.toml 文件中记录的那个名称.命令 activate . 的作用正是把程序包管理器的操作目录切换到当前项目所在的目录,即:~/Projects/Programs.jl.还记得吗?它原先的(或者说默认的)操作目录是 ~/.julia/environments/v1.3,对应于 Julia 的 v1.3 版本的全局环境.顺便说一下,如果你想切换回全局环境,那么只需要再次输入命令 activate(不加任何参数)就可以了.

   在这之后,我们再在当前的 REPL 环境中导入 Programs 就不会有问题了:

julia> import Programs
[ Info: Precompiling Programs [e525bb1a-bb1e-11e9-07f5-1125a61c95e2]

julia> Programs.greet()
Hello World!

   如果我们确实需要在全局环境中引入 Programs,那么可以先把这个项目上传到一个代码托管仓库(比如 GitHub)中,然后再使用 Julia 的程序包管理器把它安装到本地的仓库目录.

   比如,我们的这个 Programs.jl 项目已经在 GitHub 上了,它的 git 地址是 git@github.com:hyper0x/Programs.jl.git.所以,我们现在就可以直接在 REPL 环境中进行如下操作:

(Programs) pkg> activate

(v1.3) pkg> add git@github.com:hyper0x/Programs.jl.git
  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
   Cloning git-repo `git@github.com:hyper0x/Programs.jl.git`
  Updating git-repo `git@github.com:hyper0x/Programs.jl.git`
 Resolving package versions...
  Updating `~/.julia/environments/v1.3/Project.toml`
  [d2b7efac] + Programs v0.1.0 #master(git@github.com:hyper0x/Programs.jl.git)
  Updating `~/.julia/environments/v1.3/Manifest.toml`
  [d2b7efac] + Programs v0.1.0 #master(git@github.com:hyper0x/Programs.jl.git)

(v1.3) pkg>

   一旦 Programs 程序包被记录在了全局环境的项目文件中,我们在该环境下引入它也就不会有问题了.


致读者: 小时百科一直以来坚持所有内容免费,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

         

友情链接: 超理论坛 | ©小时科技 保留一切权利