查看源代码 目录结构

要求:本指南假设您已阅读过入门指南并成功运行了一个 Phoenix 应用程序启动并运行.

当我们使用mix phx.new 生成一个新的 Phoenix 应用程序时,它会构建如下所示的顶层目录结构

├── _build
├── assets
├── config
├── deps
├── lib
│   ├── hello
│   ├── hello.ex
│   ├── hello_web
│   └── hello_web.ex
├── priv
└── test

我们将逐一介绍这些目录。

  • _build - 由 mix 命令行工具创建的目录,该工具随 Elixir 一起提供,用于保存所有编译后的工件。正如我们在 "启动并运行" 中看到的,mix 是您应用程序的主要接口。我们使用 Mix 来编译代码、创建数据库、运行服务器等等。此目录不能被检入版本控制系统,并且可以随时删除。删除它将强制 Mix 从头开始重建您的应用程序。

  • assets - 一个保存前端资产源代码的目录,通常是 JavaScript 和 CSS。这些源代码会由 esbuild 工具自动捆绑。静态文件(例如图像和字体)放在 priv/static 中。

  • config - 一个保存项目配置的目录。 config/config.exs 文件是您的配置的入口点。在 config/config.exs 的最后,它会导入环境特定的配置,这些配置可以在 config/dev.exsconfig/test.exsconfig/prod.exs 中找到。最后, config/runtime.exs 会被执行,它是读取机密和其他动态配置的最佳位置。

  • deps - 一个包含我们所有 Mix 依赖项的目录。您可以在 mix.exs 文件中的 defp deps do 函数定义中找到所有依赖项。此目录不能被检入版本控制系统,并且可以随时删除。删除它将强制 Mix 从头开始下载所有依赖项。

  • lib - 一个保存应用程序源代码的目录。此目录被分成两个子目录,lib/hellolib/hello_weblib/hello 目录将负责托管所有业务逻辑和业务领域。它通常直接与数据库交互 - 它是在 Model-View-Controller (MVC) 架构中的“Model”。lib/hello_web 负责将您的业务领域公开给世界,在本例中,是通过 Web 应用程序。它包含来自 MVC 的 View 和 Controller。我们将在接下来的部分中更详细地讨论这些目录的内容。

  • priv - 一个保存所有在生产中必需但在源代码中不直接包含的资源的目录。您通常会将数据库脚本、翻译文件、图像等等放在这里。从 assets 目录中的文件生成的资产默认情况下会放在 priv/static/assets 中。

  • test - 一个包含所有应用程序测试的目录。它通常反映 lib 中找到的相同结构。

lib/hello 目录

lib/hello 目录托管所有业务领域。由于我们的项目还没有任何业务逻辑,因此该目录基本上是空的。您只会找到三个文件

lib/hello
├── application.ex
├── mailer.ex
└── repo.ex

lib/hello/application.ex 文件定义了一个名为 Hello.Application 的 Elixir 应用程序。这是因为最终 Phoenix 应用程序只是 Elixir 应用程序。 Hello.Application 模块定义了哪些服务是我们应用程序的一部分

children = [
  HelloWeb.Telemetry,
  Hello.Repo,
  {Phoenix.PubSub, name: Hello.PubSub},
  HelloWeb.Endpoint
]

如果您是第一次使用 Phoenix,现在不用担心细节。目前,我们只需知道我们的应用程序启动了一个数据库存储库、一个用于在进程和节点之间共享消息的 PubSub 系统,以及应用程序端点,它实际上用于处理 HTTP 请求。这些服务会按照它们定义的顺序启动,并且在关闭应用程序时,会以相反的顺序停止。

您可以在Elixir 的 Application 官方文档中了解更多关于应用程序的信息。

lib/hello/mailer.ex 文件包含 Hello.Mailer 模块,它定义了用于发送电子邮件的主要接口

defmodule Hello.Mailer do
  use Swoosh.Mailer, otp_app: :hello
end

在同一个 lib/hello 目录中,我们会找到一个 lib/hello/repo.ex。它定义了一个 Hello.Repo 模块,它是我们与数据库交互的主要接口。如果您使用的是 Postgres(默认数据库),您将看到类似的内容

defmodule Hello.Repo do
  use Ecto.Repo,
    otp_app: :hello,
    adapter: Ecto.Adapters.Postgres
end

目前就这些。在您进行项目开发时,我们将向此目录添加文件和模块。

lib/hello_web 目录

lib/hello_web 目录包含我们应用程序的 Web 相关部分。展开后看起来像这样

lib/hello_web
├── controllers
│   ├── page_controller.ex
│   ├── page_html.ex
│   ├── error_html.ex
│   ├── error_json.ex
│   └── page_html
│       └── home.html.heex
├── components
│   ├── core_components.ex
│   ├── layouts.ex
│   └── layouts
│       ├── app.html.heex
│       └── root.html.heex
├── endpoint.ex
├── gettext.ex
├── router.ex
└── telemetry.ex

当前位于 controllerscomponents 目录中的所有文件都用于创建我们在 "启动并运行" 指南中看到的“欢迎使用 Phoenix!”页面。

通过查看 controllercomponents 目录,我们可以看到 Phoenix 提供了开箱即用的布局、HTML 和错误页面处理功能。

除了提到的目录之外, lib/hello_web 在其根目录中还有四个文件。 lib/hello_web/endpoint.ex 是 HTTP 请求的入口点。一旦浏览器访问 http://localhost:4000,端点就会开始处理数据,最终导致路由器,它在 lib/hello_web/router.ex 中定义。路由器定义了将请求分派到“控制器”的规则,控制器会调用视图模块来将 HTML 页面渲染回客户端。我们将在其他指南中详细介绍这些层,从下一篇 "请求生命周期" 指南开始。

通过遥测,Phoenix 能够收集应用程序的指标并发送监控事件。 lib/hello_web/telemetry.ex 文件定义了负责管理遥测进程的监督者。您可以在遥测指南中找到有关此主题的更多信息。

最后,还有一个 lib/hello_web/gettext.ex 文件,它通过Gettext 提供国际化功能。如果您不担心国际化,可以安全地跳过此文件及其内容。

assets 目录

assets 目录包含与前端资产相关的源文件,例如 JavaScript 和 CSS。从 Phoenix v1.6 开始,我们使用 esbuild 来编译资产,它由 esbuild Elixir 包管理。与 esbuild 的集成已内置到您的应用程序中。相关配置可以在您的 config/config.exs 文件中找到。

您其他的静态资产放在 priv/static 文件夹中,其中 priv/static/assets 用于保存生成的资产。 priv/static 中的所有内容都由 Plug.Static 插件提供服务,该插件在 lib/hello_web/endpoint.ex 中配置。在开发模式下运行 (MIX_ENV=dev) 时,Phoenix 会监视您在 assets 目录中所做的任何更改,然后在您工作时负责更新浏览器中的前端应用程序。

请注意,当您第一次使用 mix phx.new 创建 Phoenix 应用程序时,可以指定会影响 assets 目录的存在和布局的选项。事实上,Phoenix 应用程序可以自带前端工具,也可以完全没有前端(如果您要编写 API,这将非常有用)。有关更多信息,您可以运行 mix help phx.new 或查看Mix 任务中的文档。

如果默认的 esbuild 集成无法满足您的需求,例如您想要使用其他构建工具,您可以切换到自定义资产构建

对于 CSS,Phoenix 附带了 Tailwind CSS 框架,为项目提供基本设置。您可以切换到您选择的任何 CSS 框架。其他参考资料可以在资产管理指南中找到。