<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>1 基础 on 编程那些事儿</title><link>https://before80.github.io/prgms/Swift/SwiftPM/essentials/</link><description>Recent content in 1 基础 on 编程那些事儿</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 13 Sep 2026 18:20:56 +0800</lastBuildDate><atom:link href="https://before80.github.io/prgms/Swift/SwiftPM/essentials/index.xml" rel="self" type="application/rss+xml"/><item><title>1.1 快速上手</title><link>https://before80.github.io/prgms/Swift/SwiftPM/essentials/1.1-GettingStarted/</link><pubDate>Fri, 11 Sep 2026 21:45:00 +0800</pubDate><guid>https://before80.github.io/prgms/Swift/SwiftPM/essentials/1.1-GettingStarted/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.swift.org/latest/documentation/packagemanagerdocs/gettingstarted/"&gt;https://docs.swift.org/latest/documentation/packagemanagerdocs/gettingstarted/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="11-快速上手"&gt;1.1 快速上手&lt;/h1&gt;
&lt;p&gt;学习创建和使用 Swift 包。&lt;/p&gt;
&lt;h2 id="Overview"&gt;概述&lt;/h2&gt;
&lt;p&gt;为了更完整地展示 Swift Package Manager 能做什么，下面的例子由三个相互依赖、可供你自行探索的包组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/apple/example-package-playingcard"&gt;PlayingCard&lt;/a&gt; —— 定义 PlayingCard、Suit 和 Rank 类型。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/apple/example-package-deckofplayingcards"&gt;DeckOfPlayingCards&lt;/a&gt; —— 定义 Deck 类型，用于洗牌和发牌，牌组由 PlayingCard 值组成。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/apple/example-package-dealer"&gt;Dealer&lt;/a&gt; —— 定义一个可执行文件，它创建 DeckOfPlayingCards、洗牌，并发出前 10 张牌。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本指南会展示如何创建一个库、让它依赖另一个库，如何使用包管理器构建和测试代码，以及如何发布你自己的包。&lt;/p&gt;</description></item><item><title>1.2 包的概念</title><link>https://before80.github.io/prgms/Swift/SwiftPM/essentials/1.2-IntroducingPackages/</link><pubDate>Fri, 11 Sep 2026 21:45:00 +0800</pubDate><guid>https://before80.github.io/prgms/Swift/SwiftPM/essentials/1.2-IntroducingPackages/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.swift.org/latest/documentation/packagemanagerdocs/introducingpackages/"&gt;https://docs.swift.org/latest/documentation/packagemanagerdocs/introducingpackages/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="12-包的概念"&gt;1.2 包的概念&lt;/h1&gt;
&lt;p&gt;学习如何创建和使用 Swift 包。&lt;/p&gt;
&lt;h2 id="Overview"&gt;概述&lt;/h2&gt;
&lt;p&gt;一个包由 &lt;code&gt;Package.swift&lt;/code&gt; 清单文件，以及源代码文件、资源和其他资产构成。清单文件（或叫包清单）用 &lt;a href="https://developer.apple.com/documentation/packagedescription"&gt;PackageDescription&lt;/a&gt; 模块定义包的名称和内容。&lt;/p&gt;</description></item><item><title>1.3 包的安全性</title><link>https://before80.github.io/prgms/Swift/SwiftPM/essentials/1.3-PackageSecurity/</link><pubDate>Fri, 11 Sep 2026 21:45:00 +0800</pubDate><guid>https://before80.github.io/prgms/Swift/SwiftPM/essentials/1.3-PackageSecurity/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.swift.org/latest/documentation/packagemanagerdocs/packagesecurity/"&gt;https://docs.swift.org/latest/documentation/packagemanagerdocs/packagesecurity/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="13-包的安全性"&gt;1.3 包的安全性&lt;/h1&gt;
&lt;p&gt;了解包管理器实现的安全特性。&lt;/p&gt;
&lt;h2 id="Trust-on-First-Use"&gt;首次使用即信任&lt;/h2&gt;
&lt;p&gt;包管理器会记录已下载包版本的&lt;strong&gt;指纹&lt;/strong&gt;，以便实施&lt;a href="https://en.wikipedia.org/wiki/Trust_on_first_use"&gt;首次使用即信任&lt;/a&gt;（TOFU）：也就是说，某个包版本第一次被下载时，包管理器信任它下载到的内容是正确的，并要求之后下载同一个包版本时必须具有相同的指纹。如果指纹发生变化，可能意味着该包已被篡改，包管理器会给出警告或返回错误。&lt;/p&gt;
&lt;p&gt;根据包版本的下载来源不同，用作指纹的值也不同：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;包版本来源&lt;/th&gt;
 &lt;th&gt;指纹&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Git 仓库&lt;/td&gt;
 &lt;td&gt;该修订版的 Git 哈希&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;包注册表&lt;/td&gt;
 &lt;td&gt;源码归档的校验和&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;包管理器把每个包的版本指纹集中保存在 &lt;code&gt;~/.swiftpm/security/fingerprints&lt;/code&gt; 目录下的单个文件中。&lt;/p&gt;</description></item></channel></rss>