<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Athens 的设计 on Athens</title><link>https://docs.gomods.io/zh/design/index.html</link><description>Recent content in Athens 的设计 on Athens</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Sun, 11 Feb 2018 15:59:56 -0500</lastBuildDate><atom:link href="https://docs.gomods.io/zh/design/index.xml" rel="self" type="application/rss+xml"/><item><title>代理</title><link>https://docs.gomods.io/zh/design/proxy/index.html</link><pubDate>Sun, 11 Feb 2018 15:59:56 -0500</pubDate><guid>https://docs.gomods.io/zh/design/proxy/index.html</guid><description>Athens 代理 Athens 代理有两个主要用途：
内部部署 公共镜像部署 本文档详细介绍了 Athens 代理的功能，您可以使用这些功能来实现任一用途。
Athens 代理的角色 将代理主要部署在企业内部可以：
托管私有模块 限制对公共模块的访问 存储公共模块 重要的是，Athens 代理并不打算作为上游代理的完整镜像。对于公共模块，其角色是在本地存储模块并提供访问控制。
当公共模块未存储时会发生什么 当用户从代理请求模块 MxV1，而 Athens 代理的存储中没有 MxV1 时，它首先确定 MxV1 是私有模块还是非私有模块。
如果是私有模块，它立即从内部 VCS 将模块存储到代理存储中。
如果不是私有模块，Athens 代理会查询其排除列表以获取非私有模块（见下文）。如果 MxV1 在排除列表上，Athens 代理返回 404 并且终止其他流程。如果 MxV1 不在排除列表上，Athens 代理执行以下算法：
upstreamDetails := lookUpstream(MxV1) if upstreamDetails == nil { return 404 // if the upstream doesn&amp;#39;t have the thing, just bail out } return upstreamDetails.baseURL这个算法的重要部分是 lookUpstream。该函数查询上游代理上的一个端点：
如果在其存储中没有 MxV1，则返回 404 如果其存储中有 MxV1，则返回 MxV1 的 base URL 在项目的更高版本中，我们可能会在代理上实现事件流，任何其他代理都可以订阅并监听其关心的模块的删除/弃用信息</description></item><item><title>通信</title><link>https://docs.gomods.io/zh/design/communication/index.html</link><pubDate>Sun, 11 Feb 2018 15:57:56 -0500</pubDate><guid>https://docs.gomods.io/zh/design/communication/index.html</guid><description>通信流程 在软件构建过程中，不可重现性一直是困扰开发者的难题。Athens 旨在解决这一问题，其存储机制尤为关键。
空存储状态 初始状态下，Athens 代理的存储为空。
用户在此阶段发出请求时，工作方式如下图所示：
用户运行 go get 来获取新模块。 Go CLI 联系 Athens 代理，请求模块 M，版本 v1.0。 Athens 代理检查其存储中是否存在此模块？不存在。 Athens 代理从底层 VCS 下载代码并将其转换为 Go 模块格式。 收到所有数据后，代理将其存储到自己的存储中并提供给用户。 用户成功获取模块。 整个过程为同步流程。
Happy Path 此刻 Athens 代理已知晓模块 M 的 v1.0 版本，可立即将该模块提供给用户，无需再从 VCS 获取。</description></item><item><title>从 VCS 到用户</title><link>https://docs.gomods.io/zh/design/from-vcs2user/index.html</link><pubDate>Sun, 11 Feb 2018 15:56:56 -0500</pubDate><guid>https://docs.gomods.io/zh/design/from-vcs2user/index.html</guid><description>您阅读了代理、通信文档，然后打开代码库并对自己说：这并不像文档描述的那么简单。
Athens 有一系列架构组件，负责处理 Go 模块从 VCS 进入存储再到用户的整个过程。如果您对这些组件如何协同工作感到困惑，请继续阅读！
从通信中，您知道当模块没有在存储中找到时，它会从 VCS（如 github.com）下载，然后提供给用户。您还知道整个过程是同步的。但阅读源码时，您会遇到模块获取器和下载协议暂存器等组件，难以区分其功能。本文将帮助您理解整个流程。
组件 请参阅下图了解各组件架构：
如图所示，存在多层包装器。您在代码中首先遇到的组件是 Storage 和 Fetcher，下面我们首先从这两个组件开始介绍。
Storage 存储 Storage 名称即其功能描述。通过 proxy/storage.go 的 GetStorage 函数创建存储实例。
基于传入的存储类型环境变量，可创建内存、文件系统、MongoDB 等多种存储。
模块存储于此。
Fetcher 获取器 Fetcher 是我们介绍的第一个组件。从名称可以推断，Fetcher（pkg/module/fetcher.go）负责从 VCS 获取源代码。
为此，需要两项要素：go 二进制文件和 afero.FileSystem，在初始化期间传递给 Fetcher。
mf, err := module.NewGoGetFetcher(goBin, fs) if err != nil { return err }app_proxy.go
当请求新模块时，会调用 Fetch 函数。
Fetch(ctx context.Context, mod, ver string) (*storage.Version, error)fetch 函数
Fetcher 的工作流程如下：
使用注入的 FileSystem 创建一个临时目录 在临时目录中构建一个虚拟的 Go 项目，包含简单的 main.go 和 go.</description></item></channel></rss>