@mcamdali/podexit 0.0.0-stage → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.de.md +254 -0
- package/README.es.md +254 -0
- package/README.fr.md +254 -0
- package/README.ja.md +254 -0
- package/README.ko.md +254 -0
- package/README.md +297 -2
- package/README.pt-BR.md +254 -0
- package/README.ru.md +254 -0
- package/README.tr.md +254 -0
- package/README.zh-CN.md +254 -0
- package/data/publisher-policy.json +42 -0
- package/data/publisher-policy.schema.json +96 -0
- package/dist/analyze.d.ts +20 -0
- package/dist/analyze.js +195 -0
- package/dist/cli/discover.d.ts +15 -0
- package/dist/cli/discover.js +65 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +11 -0
- package/dist/cli/run.d.ts +19 -0
- package/dist/cli/run.js +146 -0
- package/dist/core/classify.d.ts +39 -0
- package/dist/core/classify.js +71 -0
- package/dist/core/lockfile.d.ts +47 -0
- package/dist/core/lockfile.js +164 -0
- package/dist/core/policy.d.ts +45 -0
- package/dist/core/policy.js +40 -0
- package/dist/core/project.d.ts +13 -0
- package/dist/core/project.js +25 -0
- package/dist/core/timeline.d.ts +16 -0
- package/dist/core/timeline.js +14 -0
- package/dist/core/versions.d.ts +11 -0
- package/dist/core/versions.js +57 -0
- package/dist/data.d.ts +3 -0
- package/dist/data.js +9 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +28 -0
- package/dist/net/cache.d.ts +28 -0
- package/dist/net/cache.js +89 -0
- package/dist/net/cocoapods.d.ts +34 -0
- package/dist/net/cocoapods.js +83 -0
- package/dist/net/fetcher.d.ts +33 -0
- package/dist/net/fetcher.js +35 -0
- package/dist/net/github.d.ts +14 -0
- package/dist/net/github.js +42 -0
- package/dist/report/escape.d.ts +17 -0
- package/dist/report/escape.js +54 -0
- package/dist/report/index.d.ts +11 -0
- package/dist/report/index.js +21 -0
- package/dist/report/labels.d.ts +22 -0
- package/dist/report/labels.js +82 -0
- package/dist/report/markdown.d.ts +6 -0
- package/dist/report/markdown.js +75 -0
- package/dist/report/tty.d.ts +12 -0
- package/dist/report/tty.js +103 -0
- package/dist/report-model.d.ts +75 -0
- package/dist/report-model.js +3 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +7 -0
- package/package.json +72 -4
package/README.tr.md
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
<!-- i18n-source: README.md@1c83a153cf8713f20722fb4899b14a3a0509ab39 status=reviewed -->
|
|
2
|
+
<!-- brand:start -->
|
|
3
|
+
|
|
4
|
+
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/banner-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/banner-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/banner-light.svg" alt="podexit: Which of your pods stop getting updates when CocoaPods trunk goes read-only, and which already ship a Swift package."></picture></p>
|
|
5
|
+
|
|
6
|
+
<!-- lang-selector:start -->
|
|
7
|
+
<p align="center"><a href="README.md">English</a> · <a href="README.tr.md">Türkçe</a> · <a href="README.zh-CN.md">简体中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.de.md">Deutsch</a> · <a href="README.fr.md">Français</a> · <a href="README.pt-BR.md">Português (Brasil)</a> · <a href="README.ru.md">Русский</a></p>
|
|
8
|
+
<!-- lang-selector:end -->
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<a href="https://github.com/muhittincamdali/podexit/actions/workflows/ci.yml"><img src="https://github.com/muhittincamdali/podexit/actions/workflows/ci.yml/badge.svg" alt="CI durumu"></a>
|
|
12
|
+
<a href="https://github.com/muhittincamdali/podexit/releases"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-version-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-version-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-version-light.svg" alt="Son sürüm: v0.1.1"></picture></a>
|
|
13
|
+
<a href="https://github.com/muhittincamdali/podexit/blob/main/package.json"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-language-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-language-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-language-light.svg" alt="Dil sürümü: Node.js 22.12+"></picture></a>
|
|
14
|
+
<a href="https://github.com/muhittincamdali/podexit/blob/main/LICENSE"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-license-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-license-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-license-light.svg" alt="Lisans: MIT"></picture></a>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<a href="#hızlı-başlangıç"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-tr-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-tr-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-tr-light.svg" alt="Başlayın"></picture></a>
|
|
19
|
+
<a href="https://muhittincamdali.github.io/podexit/"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-docs-tr-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-docs-tr-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-docs-tr-light.svg" alt="Dokümantasyon"></picture></a>
|
|
20
|
+
<a href="https://github.com/muhittincamdali/podexit/tree/main/docs/guides"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-guides-tr-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-guides-tr-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-guides-tr-light.svg" alt="Rehberler"></picture></a>
|
|
21
|
+
<a href="https://github.com/muhittincamdali/podexit/tree/main/examples"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-examples-tr-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-examples-tr-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-examples-tr-light.svg" alt="Örnekler"></picture></a>
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
> Bu belge İngilizce README'nin çevirisidir. İkisi arasında fark varsa güncel olan İngilizce sürümdür.
|
|
25
|
+
|
|
26
|
+
<!-- brand:end -->
|
|
27
|
+
|
|
28
|
+
CocoaPods trunk 2 Aralık 2026'da salt okunur olacak. Derlemeleriniz çalışmaya devam eder, ancak orada yayımlanmış pod'lar bir daha güncelleme almaz. podexit, bağımlılıklarınızdan hangilerinin donduğunu, hangilerinin zaten Swift paketi sunduğunu ve yerel iOS, Flutter ile React Native/Expo için geçiş yolunu gösterir. Zaten elinizde olan `Podfile.lock` dosyasını okur; projenize hiçbir şey kurulmaz.
|
|
29
|
+
|
|
30
|
+
<picture><source media="(prefers-color-scheme: dark)" srcset="docs/media/demo-native-dark.svg"><source media="(prefers-color-scheme: light)" srcset="docs/media/demo-native-light.svg"><img src="docs/media/demo-native-light.svg" alt="Yerel bir iOS uygulamasında çalışan podexit: 12.x ile sınırlanmış Firebase pod'ları; 2 Aralık'tan sonra donacak Alamofire, Kingfisher, SnapKit ve diğerleri, her birinin Swift paketiyle birlikte"></picture>
|
|
31
|
+
|
|
32
|
+
<sub>Gerçek CLI ile <a href="fixtures/native-app/Podfile">native-app fixture</a> üzerinde kaydedildi; trunk ve GitHub yanıtları 14 Ekim 2026'da kaydedilmiştir (<code>npm run demo</code>).</sub>
|
|
33
|
+
|
|
34
|
+
## Öne çıkanlar
|
|
35
|
+
|
|
36
|
+
- **Her pod için iki yanıt**: güncelleme almayı bırakıp bırakmayacağı (trunk'ta donmuş, yayıncısı tarafından erkenden sınırlanmış ya da etkilenmiyor) ve upstream deposunda `Package.swift` olup olmadığı.
|
|
37
|
+
- **Sürüm duyarlı**: kilitlediğiniz etiketteki `Package.swift` dosyasına da bakar ve Swift paketinin yalnızca daha yeni sürümlerde bulunduğu durumu belirtir.
|
|
38
|
+
- **Firebase sınırı yerleşik**: Firebase'in listelenen 20 pod'u ve alt bağımlılıkları 12.x ile sınırlanır; bu bilgi, Firebase sayfasını kaynak gösteren bir veri dosyasından gelir.
|
|
39
|
+
- **Yerel, Flutter, React Native ve Expo**: `Podfile.lock` dosyasını klasörün kendisinde ya da `ios/`, `macos/`, `example/ios/` veya `example/macos/` altında bulur, proje türünü tanır ve ilgili rehbere bağlantı verir.
|
|
40
|
+
- **Terminal, Markdown veya JSON**: sizin için bir tablo, pull request için Markdown, betikler için JSON.
|
|
41
|
+
- **Çevrimdışı çalışır**: yanıtlar `~/.cache/podexit` içinde 24 saat önbellekte tutulur; `--offline` yalnızca önbelleği kullanır.
|
|
42
|
+
|
|
43
|
+
## Hızlı başlangıç
|
|
44
|
+
|
|
45
|
+
[Node.js](https://nodejs.org/) 22.12 veya üstü gerekir (`node --version` sürümü gösterir; Mac'te `brew install node` ile kurulur). Başka hiçbir şey gerekmez.
|
|
46
|
+
|
|
47
|
+
**1. Uygulamanızın klasöründe bir terminal açın**; yani `Podfile`, `ios/` klasörü veya (Flutter eklentisi için) `example/` klasörü bulunan klasörde:
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
cd path/to/YourApp
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**2. podexit'i çalıştırın:**
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
npx @mcamdali/podexit
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
npm paketi `@mcamdali/podexit`tir (npm kapsamsız adı reddetti); kurduğu komut hâlâ `podexit`'tir.
|
|
60
|
+
|
|
61
|
+
**3. Tabloyu okuyun.** **capped** işaretli satırlar ilk önce durur (Firebase, CocoaPods'a yayımlamayı Ekim 2026'da bırakıyor); **frozen after Dec 2** işaretli satırlar 2 Aralık'tan sonra yeni sürüm almaz. Swift package sütununda **yes** yazıyorsa pod şimdiden taşınabilir. Son satır, proje türünüze uygun rehbere bağlantı verir.
|
|
62
|
+
|
|
63
|
+
## 2 Aralık'ta neler değişiyor (ve neler değişmiyor)
|
|
64
|
+
|
|
65
|
+
[CocoaPods duyurusuna](https://blog.cocoapods.org/CocoaPods-Specs-Repo/) ve [Firebase geçiş sayfasına](https://firebase.google.com/docs/ios/cocoapods-deprecation) göre:
|
|
66
|
+
|
|
67
|
+
1. **Derlemeler çalışmaya devam eder.** Specs deposu ve CDN çevrimiçi kalır; `pod install` yayımlanmış tüm sürümleri çözmeye devam eder. Salt okunur modun deneme çalıştırması 1–7 Kasım 2026'da yapılacak.
|
|
68
|
+
2. **Trunk'taki pod'lar**, başka bir yolla (genellikle Swift paketi olarak) yayımlanmadıkça 2 Aralık 2026'dan sonra güvenlik düzeltmeleri dahil yeni sürüm almaz.
|
|
69
|
+
3. **Firebase 12, CocoaPods'taki son ana sürümdür** ve Firebase orada yayımlamayı Ekim 2026'da bırakır. 12 ve öncesi sürümler kurulabilir kalır.
|
|
70
|
+
|
|
71
|
+
Ayrıntılar için [2 Aralık'ta neler değişiyor](docs/guides/what-changes.md) rehberine bakın.
|
|
72
|
+
|
|
73
|
+
## Kurulum
|
|
74
|
+
|
|
75
|
+
Kurmadan çalıştırın ya da sürümü sabitlemek için bir projeye ekleyin:
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
npm install --save-dev @mcamdali/podexit
|
|
79
|
+
npx @mcamdali/podexit
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Komutu genel olarak kurmak için:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
npm i -g @mcamdali/podexit
|
|
86
|
+
podexit
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Homebrew kullananlar, GitHub'daki sürüm arşivini kuran `brew install muhittincamdali/tap/podexit` komutunu çalıştırabilir.
|
|
90
|
+
|
|
91
|
+
## Kullanım
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
podexit [paths...] [options]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
| Seçenek | Ne yapar |
|
|
98
|
+
| ----------------------- | ------------------------------------------------------------------------------- |
|
|
99
|
+
| `paths` | `Podfile.lock` dosyaları veya proje klasörleri; varsayılan geçerli klasördür |
|
|
100
|
+
| `-f, --format <format>` | `tty` (varsayılan), `markdown` veya `json` |
|
|
101
|
+
| `-o, --output <file>` | Raporu terminal yerine bir dosyaya yazar |
|
|
102
|
+
| `-a, --all` | Yerel yol, git ve özel spec kaynaklı pod'ları da tabloda listeler |
|
|
103
|
+
| `--offline` | Yalnızca önbellekteki yanıtları kullanır; ağa hiç dokunmaz |
|
|
104
|
+
| `--refresh` | Önbelleği yok sayar ve ağa yeniden sorar |
|
|
105
|
+
| `--cache-dir <dir>` | Önbellek klasörü (varsayılan `$XDG_CACHE_HOME/podexit` veya `~/.cache/podexit`) |
|
|
106
|
+
| `--no-color` | Terminalde bile düz metin (`NO_COLOR` ve `FORCE_COLOR` dikkate alınır) |
|
|
107
|
+
| `--concurrency <n>` | Paralel pod sorguları, 1 ile 64 arası (varsayılan 8) |
|
|
108
|
+
|
|
109
|
+
Çıkış kodları: `0` rapor yazıldı, `2` hatalı argüman, `Podfile.lock` bulunamadı veya dosya `Podfile.lock` değil, `1` beklenmeyen her durum. podexit rapor verir; bulduklarından dolayı bir derlemeyi başarısız kılmaz.
|
|
110
|
+
|
|
111
|
+
Yol verilmezse podexit `Podfile.lock`, `ios/Podfile.lock`, `macos/Podfile.lock`, `example/ios/Podfile.lock` ve `example/macos/Podfile.lock` konumlarında bulduğu her kilit dosyasını okur; yol olarak verilen bir klasör de aynı şekilde aranır.
|
|
112
|
+
|
|
113
|
+
| Ortam değişkeni | Ne yapar |
|
|
114
|
+
| -------------------------- | ---------------------------------------------------------------------------- |
|
|
115
|
+
| `PODEXIT_CACHE_DIR` | `--cache-dir` verilmediğinde kullanılan önbellek klasörü |
|
|
116
|
+
| `GITHUB_TOKEN`, `GH_TOKEN` | Yalnızca GitHub sunucularına gönderilir; özel upstream depoları için gerekir |
|
|
117
|
+
| `NO_COLOR`, `FORCE_COLOR` | Terminal renklerini kapatır veya açar |
|
|
118
|
+
|
|
119
|
+
### Markdown raporunu kodla birlikte saklayın
|
|
120
|
+
|
|
121
|
+
```sh
|
|
122
|
+
npx @mcamdali/podexit --format markdown --output podexit.md
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Markdown sürümünde aynı tablolar, yayın tarihleri ve her Swift paketi deposuna bağlantılar bulunur; yerel yol ve git kaynaklı pod'lar bir `<details>` bloğunda toplanır.
|
|
126
|
+
|
|
127
|
+
### JSON raporunu betiklerde kullanın
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
npx @mcamdali/podexit --format json > podexit.json
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Her pod; `updates.status`, `swiftPackage.status`, trunk'taki son sürümü ve tarihini, ayrıca her yanıtı açıklayan bir cümle taşır. Şema `schemaVersion` 0'dır ve 1.0'dan önce değişebilir. [examples/shell/frozen-pods.sh](examples/shell/frozen-pods.sh) bunu `jq` ile süzer.
|
|
134
|
+
|
|
135
|
+
### CI'da çalıştırın
|
|
136
|
+
|
|
137
|
+
[examples/github-actions/podexit.yml](examples/github-actions/podexit.yml), `Podfile.lock` dosyasını değiştiren her pull request'in iş özetine raporu ekler.
|
|
138
|
+
|
|
139
|
+
### Hız sınırları ve özel depolar
|
|
140
|
+
|
|
141
|
+
podexit, `Package.swift` dosyasını GitHub API kotasını kullanmayan raw.githubusercontent.com üzerinden okur. Özel upstream depolarına bakmak için `GITHUB_TOKEN` (veya `GH_TOKEN`) tanımlayın; belirteç yalnızca GitHub sunucularına gönderilir.
|
|
142
|
+
|
|
143
|
+
### JavaScript'ten
|
|
144
|
+
|
|
145
|
+
```js
|
|
146
|
+
import {
|
|
147
|
+
analyzeLockfile,
|
|
148
|
+
buildReport,
|
|
149
|
+
CachedFetcher,
|
|
150
|
+
HttpFetcher,
|
|
151
|
+
loadPublisherPolicy,
|
|
152
|
+
render,
|
|
153
|
+
} from '@mcamdali/podexit';
|
|
154
|
+
|
|
155
|
+
const policy = loadPublisherPolicy();
|
|
156
|
+
const fetcher = new CachedFetcher(new HttpFetcher({ userAgent: 'my-tool' }), {
|
|
157
|
+
directory: '.cache',
|
|
158
|
+
});
|
|
159
|
+
const lockfile = await analyzeLockfile(text, 'ios/Podfile.lock', { fetcher, policy });
|
|
160
|
+
console.log(render(buildReport([lockfile], { policy, offline: false }), 'markdown'));
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Çalıştırılabilir sürümü [examples/api/summary.mjs](examples/api/summary.mjs) dosyasındadır.
|
|
164
|
+
|
|
165
|
+
## Demo
|
|
166
|
+
|
|
167
|
+
Üç kayıt [fixtures](fixtures/README.md) klasöründen gelir: her biri kendi araç zinciriyle oluşturulmuş ve CocoaPods 1.16.2 ile çözümlenmiş gerçek projeler; 14 Ekim 2026'da kaydedilen yanıtlarla yeniden oynatılır.
|
|
168
|
+
|
|
169
|
+
| Proje | Kayıt |
|
|
170
|
+
| ---------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
|
171
|
+
| Yerel iOS uygulaması (Firebase, Alamofire, Google Sign-In) | bu sayfanın üstünde |
|
|
172
|
+
| Flutter uygulaması (FlutterFire, google_sign_in, …) | [açık](docs/media/demo-flutter-light.svg) · [koyu](docs/media/demo-flutter-dark.svg) |
|
|
173
|
+
| Expo SDK 57 uygulaması (Sentry, RevenueCat, Lottie) | [açık](docs/media/demo-expo-light.svg) · [koyu](docs/media/demo-expo-dark.svg) |
|
|
174
|
+
|
|
175
|
+
14 Ekim 2026'da Node.js 25.9 ile bir Mac'te (Apple silicon, M5 Max) ölçüldü: yerel fixture'da (28 pod) ilk çalıştırma 112 istek yaptı ve 6,6 ile 7,1 saniye sürdü; ikinci çalıştırma yanıtları önbellekten 0,3 saniyede verdi. İlk sürenin çoğunu ağ hızı belirler.
|
|
176
|
+
|
|
177
|
+
Kayıtları yeniden oluşturmak için: `npm run demo`.
|
|
178
|
+
|
|
179
|
+
## Durum
|
|
180
|
+
|
|
181
|
+
| Özellik | Durum |
|
|
182
|
+
| ---------------------------------------------------------------------------------- | --------------- |
|
|
183
|
+
| `Podfile.lock` okuma: pod'lar, subspec'ler, bağımlılık grafiği, her pod'un kaynağı | çalışıyor |
|
|
184
|
+
| CocoaPods trunk'tan son sürüm ve yayın tarihleri | çalışıyor |
|
|
185
|
+
| Varsayılan dalda ve kilitli etiketteki `Package.swift` | çalışıyor |
|
|
186
|
+
| Yayıncı sınırları (Firebase 12.x) ve alt bağımlılıkları | çalışıyor |
|
|
187
|
+
| Yerel, Flutter uygulaması, Flutter eklentisi, React Native ve Expo tespiti | çalışıyor |
|
|
188
|
+
| Terminal, Markdown ve JSON raporları; `--offline` önbellek tekrar oynatma | çalışıyor |
|
|
189
|
+
| Her pod'u getiren npm veya pub.dev paketini adlandırma | planlandı (0.3) |
|
|
190
|
+
| Pod başına Swift paketi ürün adları ve sürümleri, `plan` → MIGRATION.md | planlandı (0.5) |
|
|
191
|
+
| SARIF çıktısı, `--fail-on`, GitHub Action | planlandı (0.5) |
|
|
192
|
+
| Yazar modu: podspec → `Package.swift` başlangıç noktası | planlandı (0.8) |
|
|
193
|
+
| Flutter `--fix`, statik web sayfası, kararlı JSON şeması | planlandı (1.0) |
|
|
194
|
+
|
|
195
|
+
## Dokümantasyon
|
|
196
|
+
|
|
197
|
+
API başvuru belgeleri ve rehberler: [muhittincamdali.github.io/podexit](https://muhittincamdali.github.io/podexit/).
|
|
198
|
+
|
|
199
|
+
## Rehberler
|
|
200
|
+
|
|
201
|
+
- [2 Aralık'ta neler değişiyor (ve neler değişmiyor)](docs/guides/what-changes.md)
|
|
202
|
+
- [Yerel iOS: CocoaPods'tan Swift Package Manager'a](docs/guides/native-ios.md)
|
|
203
|
+
- [Flutter uygulamaları ve eklentileri](docs/guides/flutter.md)
|
|
204
|
+
- [React Native ve Expo](docs/guides/react-native-expo.md)
|
|
205
|
+
- [Firebase 12 sonrası](docs/guides/firebase.md)
|
|
206
|
+
- [Pod yazarları: `pod trunk push` yerine ne kullanmalı](docs/guides/pod-authors.md)
|
|
207
|
+
|
|
208
|
+
## Gereksinimler
|
|
209
|
+
|
|
210
|
+
| Araç zinciri | En düşük sürüm |
|
|
211
|
+
| ------------ | -------------- |
|
|
212
|
+
| Node.js | 22.12 |
|
|
213
|
+
|
|
214
|
+
CI, testleri Node.js 22 ve 24'te (Linux) çalıştırır. Yerelde testler bir Mac'te (Apple silicon) Node.js 22.23, 24.22 ve 25.9 ile geçer.
|
|
215
|
+
|
|
216
|
+
## Mimari
|
|
217
|
+
|
|
218
|
+
```text
|
|
219
|
+
Podfile.lock ─► parseLockfile pods, subspecs, dependency graph, source per pod
|
|
220
|
+
─► classifyLockfile frozen-on-trunk | capped | not-affected | unknown
|
|
221
|
+
data/publisher-policy.json (sourced; Firebase 12.x)
|
|
222
|
+
─► analyzeLockfile per trunk pod, through a Fetcher:
|
|
223
|
+
cdn.cocoapods.org versions and podspec (GitHub repository and tag)
|
|
224
|
+
trunk.cocoapods.org release dates
|
|
225
|
+
raw.githubusercontent.com Package.swift at HEAD and at the locked tag
|
|
226
|
+
─► buildReport ─► render tty | markdown | json
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
- `src/core/` saftır: ayrıştırma, sürüm karşılaştırma, sınıflandırma. G/Ç yoktur.
|
|
230
|
+
- Ağdan gelen her şey bir `Fetcher` üzerinden geçer. `CachedFetcher` her istek için bir JSON dosyası saklar; aynı dosyalar, testlerin ve `--offline` modunun yeniden oynattığı kayıtlı yanıtlardır.
|
|
231
|
+
- Eksik bir yanıt hata olarak değil, nedeniyle birlikte `unknown` olarak raporlanır.
|
|
232
|
+
- CLI (`src/cli/`) yalnızca argümanları ayrıştırır, kilit dosyalarını bulur ve çıktıyı yazar.
|
|
233
|
+
|
|
234
|
+
## Yol haritası
|
|
235
|
+
|
|
236
|
+
[Durum](#durum) tablosuna bakın: 0.3 her pod'un arkasındaki npm ve pub.dev paketini, 0.5 geçiş planını, SARIF'i ve bir GitHub Action'ı, 0.8 yazar modunu, 1.0 kararlı bir JSON şemasını getirir. Her sürümün neleri değiştirdiği [CHANGELOG.md](CHANGELOG.md) dosyasında listelenir.
|
|
237
|
+
|
|
238
|
+
## SSS
|
|
239
|
+
|
|
240
|
+
**Uygulamam 2 Aralık'ta derlenmeyi bırakacak mı?** Hayır. Hem CocoaPods hem Firebase mevcut sürümlerin kurulabilir kalacağını söylüyor. podexit, alamayacağınız güncellemelerle ilgilidir; durup kalan derlemelerle değil.
|
|
241
|
+
|
|
242
|
+
**Bir pod neden "unknown"?** Podspec'i GitHub dışında bir sunucuya (örneğin dl.google.com üzerindeki bir ikili dosyaya) işaret ediyordur ya da ağ kullanılamamıştır. JSON ve Markdown raporları nedeni pod başına verir.
|
|
243
|
+
|
|
244
|
+
**Flutter eklentileri ve React Native modülleri neden "not affected"?** Bunlar `.symlinks/plugins` veya `node_modules` altındaki yerel yol pod'larıdır; pub veya npm ile güncellenirler. Bağlı oldukları SDK'lar ayrıca listelenir ve onlar donmuş olabilir.
|
|
245
|
+
|
|
246
|
+
**podexit projemi değiştirir mi?** Hayır. `Podfile.lock` dosyasını okur; yalnızca önbelleğini ve istediğiniz raporu yazar.
|
|
247
|
+
|
|
248
|
+
## Katkıda bulunma
|
|
249
|
+
|
|
250
|
+
Katkılarınızı bekliyoruz. Pull request açmadan önce [CONTRIBUTING.md](CONTRIBUTING.md) dosyasını ve [davranış kurallarını](https://github.com/muhittincamdali/.github/blob/main/CODE_OF_CONDUCT.md) okuyun. Güvenlik açıklarını [SECURITY.md](SECURITY.md) dosyasında anlatıldığı gibi bildirin.
|
|
251
|
+
|
|
252
|
+
## Lisans
|
|
253
|
+
|
|
254
|
+
MIT lisansıyla yayımlanmıştır. Ayrıntılar için [LICENSE](LICENSE) dosyasına bakın.
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
<!-- i18n-source: README.md@1c83a153cf8713f20722fb4899b14a3a0509ab39 status=reviewed -->
|
|
2
|
+
<!-- brand:start -->
|
|
3
|
+
|
|
4
|
+
<p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/banner-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/banner-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/banner-light.svg" alt="podexit: Which of your pods stop getting updates when CocoaPods trunk goes read-only, and which already ship a Swift package."></picture></p>
|
|
5
|
+
|
|
6
|
+
<!-- lang-selector:start -->
|
|
7
|
+
<p align="center"><a href="README.md">English</a> · <a href="README.tr.md">Türkçe</a> · <a href="README.zh-CN.md">简体中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.de.md">Deutsch</a> · <a href="README.fr.md">Français</a> · <a href="README.pt-BR.md">Português (Brasil)</a> · <a href="README.ru.md">Русский</a></p>
|
|
8
|
+
<!-- lang-selector:end -->
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<a href="https://github.com/muhittincamdali/podexit/actions/workflows/ci.yml"><img src="https://github.com/muhittincamdali/podexit/actions/workflows/ci.yml/badge.svg" alt="CI 状态"></a>
|
|
12
|
+
<a href="https://github.com/muhittincamdali/podexit/releases"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-version-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-version-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-version-light.svg" alt="最新版本: v0.1.1"></picture></a>
|
|
13
|
+
<a href="https://github.com/muhittincamdali/podexit/blob/main/package.json"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-language-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-language-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-language-light.svg" alt="语言版本: Node.js 22.12+"></picture></a>
|
|
14
|
+
<a href="https://github.com/muhittincamdali/podexit/blob/main/LICENSE"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-license-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-license-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/badge-license-light.svg" alt="许可证: MIT"></picture></a>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<a href="#快速开始"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-zh-CN-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-zh-CN-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-zh-CN-light.svg" alt="开始使用"></picture></a>
|
|
19
|
+
<a href="https://muhittincamdali.github.io/podexit/"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-docs-zh-CN-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-docs-zh-CN-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-docs-zh-CN-light.svg" alt="文档"></picture></a>
|
|
20
|
+
<a href="https://github.com/muhittincamdali/podexit/tree/main/docs/guides"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-guides-zh-CN-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-guides-zh-CN-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-guides-zh-CN-light.svg" alt="指南"></picture></a>
|
|
21
|
+
<a href="https://github.com/muhittincamdali/podexit/tree/main/examples"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-examples-zh-CN-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-examples-zh-CN-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-examples-zh-CN-light.svg" alt="示例"></picture></a>
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
> 本文是英文 README 的译文。如两者内容不一致,以英文版为准。
|
|
25
|
+
|
|
26
|
+
<!-- brand:end -->
|
|
27
|
+
|
|
28
|
+
CocoaPods trunk 将于 2026 年 12 月 2 日转为只读。你的构建仍可正常运行,但发布在 trunk 上的 pod 将不会再有任何更新。podexit 会告诉你,哪些依赖已经冻结,哪些已经提供 Swift 包,并给出原生 iOS、Flutter 以及 React Native/Expo 的迁移路径。它读取你现有的 `Podfile.lock`,不会向你的项目安装任何东西。
|
|
29
|
+
|
|
30
|
+
<picture><source media="(prefers-color-scheme: dark)" srcset="docs/media/demo-native-dark.svg"><source media="(prefers-color-scheme: light)" srcset="docs/media/demo-native-light.svg"><img src="docs/media/demo-native-light.svg" alt="podexit 在原生 iOS 应用上的运行结果:Firebase 的 pod 被限制在 12.x,Alamofire、Kingfisher、SnapKit 等将在 12 月 2 日之后冻结,且每个都提供 Swift 包"></picture>
|
|
31
|
+
|
|
32
|
+
<sub>由真实的 CLI 在 <a href="fixtures/native-app/Podfile">native-app fixture</a> 上录制,trunk 和 GitHub 的响应保存于 2026 年 10 月 14 日(<code>npm run demo</code>)。</sub>
|
|
33
|
+
|
|
34
|
+
## 亮点
|
|
35
|
+
|
|
36
|
+
- **每个 pod 两个结论**:它是否会停止获得更新(在 trunk 上已冻结、被发布方提前限制版本,或不受影响),以及其上游仓库是否有 `Package.swift`。
|
|
37
|
+
- **感知版本**:同样会检查你锁定的 tag 上的 `Package.swift`,并在 Swift 包仅存在于较新版本时给出提示。
|
|
38
|
+
- **内置 Firebase 版本上限**:Firebase 列出的 20 个 pod 及其子依赖都被限制在 12.x,数据来自一个引用了 Firebase 页面的、有来源出处的数据文件。
|
|
39
|
+
- **原生、Flutter、React Native 和 Expo**:在当前文件夹或 `ios/`、`macos/`、`example/ios/`、`example/macos/` 中自动查找 `Podfile.lock`,识别项目类型,并链接到对应的指南。
|
|
40
|
+
- **终端、Markdown 或 JSON**:给你看的是表格,给 pull request 用的是 Markdown,给脚本用的是 JSON。
|
|
41
|
+
- **可离线使用**:响应会在 `~/.cache/podexit` 中缓存 24 小时;`--offline` 只使用缓存。
|
|
42
|
+
|
|
43
|
+
## 快速开始
|
|
44
|
+
|
|
45
|
+
你需要 [Node.js](https://nodejs.org/) 22.12 或更高版本(`node --version` 会显示版本号;在 Mac 上可用 `brew install node` 安装),无需其他依赖。
|
|
46
|
+
|
|
47
|
+
**1. 在你的应用文件夹中打开终端**,即包含 `Podfile`、`ios/` 文件夹(Flutter 插件则是 `example/` 文件夹)的那个文件夹:
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
cd path/to/YourApp
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**2. 运行 podexit:**
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
npx @mcamdali/podexit
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
npm 包名为 `@mcamdali/podexit`(npm 拒绝了不带作用域的名称);它安装的命令仍然是 `podexit`。
|
|
60
|
+
|
|
61
|
+
**3. 阅读表格。** 标记为 **capped** 的行最先停止更新(Firebase 将在 2026 年 10 月停止向 CocoaPods 发布);标记为 **frozen after Dec 2** 的行在 12 月 2 日之后不会再有新版本。Swift package 一列显示 **yes** 的 pod,现在就可以迁移。最后一行会链接到适合你项目类型的指南。
|
|
62
|
+
|
|
63
|
+
## 12 月 2 日会发生什么变化(以及哪些不变)
|
|
64
|
+
|
|
65
|
+
以下内容来自 [CocoaPods 公告](https://blog.cocoapods.org/CocoaPods-Specs-Repo/)和 [Firebase 迁移页面](https://firebase.google.com/docs/ios/cocoapods-deprecation):
|
|
66
|
+
|
|
67
|
+
1. **构建仍可正常运行。** Specs 仓库和 CDN 保持在线;`pod install` 仍可解析所有已发布的版本。只读模式的试运行安排在 2026 年 11 月 1 日至 7 日。
|
|
68
|
+
2. **trunk 上的 pod** 在 2026 年 12 月 2 日之后不会再有新版本(包括安全修复),除非它们通过其他方式发布(通常是 Swift 包)。
|
|
69
|
+
3. **Firebase 12 是 CocoaPods 上的最后一个主版本**,Firebase 将在 2026 年 10 月停止在那里发布。12 及更早的版本仍可安装。
|
|
70
|
+
|
|
71
|
+
详见[12 月 2 日会发生什么变化](docs/guides/what-changes.md)。
|
|
72
|
+
|
|
73
|
+
## 安装
|
|
74
|
+
|
|
75
|
+
无需安装即可直接运行,或将其添加到项目中以固定版本:
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
npm install --save-dev @mcamdali/podexit
|
|
79
|
+
npx @mcamdali/podexit
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
若要全局安装该命令:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
npm i -g @mcamdali/podexit
|
|
86
|
+
podexit
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Homebrew 用户可以运行 `brew install muhittincamdali/tap/podexit`,它会安装 GitHub 上的发布压缩包。
|
|
90
|
+
|
|
91
|
+
## 使用方法
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
podexit [paths...] [options]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
| 选项 | 作用 |
|
|
98
|
+
| ----------------------- | -------------------------------------------------------------------- |
|
|
99
|
+
| `paths` | `Podfile.lock` 文件或项目文件夹;默认为当前文件夹 |
|
|
100
|
+
| `-f, --format <format>` | `tty`(默认)、`markdown` 或 `json` |
|
|
101
|
+
| `-o, --output <file>` | 将报告写入文件,而不是输出到终端 |
|
|
102
|
+
| `-a, --all` | 同时在表格中列出来自本地路径、git 和私有 spec 的 pod |
|
|
103
|
+
| `--offline` | 仅使用缓存的响应,完全不访问网络 |
|
|
104
|
+
| `--refresh` | 忽略缓存,重新向网络请求 |
|
|
105
|
+
| `--cache-dir <dir>` | 缓存文件夹(默认为 `$XDG_CACHE_HOME/podexit` 或 `~/.cache/podexit`) |
|
|
106
|
+
| `--no-color` | 即使在终端中也输出纯文本(遵循 `NO_COLOR` 和 `FORCE_COLOR`) |
|
|
107
|
+
| `--concurrency <n>` | 并行查询 pod 的数量,1 到 64(默认 8) |
|
|
108
|
+
|
|
109
|
+
退出码:`0` 表示已写出报告;`2` 表示参数错误、未找到 `Podfile.lock`,或文件不是 `Podfile.lock`;`1` 表示其他任何意外情况。podexit 只负责报告,不会因为检查结果而让构建失败。
|
|
110
|
+
|
|
111
|
+
不指定路径时,podexit 会读取在 `Podfile.lock`、`ios/Podfile.lock`、`macos/Podfile.lock`、`example/ios/Podfile.lock` 和 `example/macos/Podfile.lock` 找到的每个锁文件;作为路径传入的文件夹也按同样方式查找。
|
|
112
|
+
|
|
113
|
+
| 环境变量 | 作用 |
|
|
114
|
+
| -------------------------- | ---------------------------------------------- |
|
|
115
|
+
| `PODEXIT_CACHE_DIR` | 未指定 `--cache-dir` 时使用的缓存文件夹 |
|
|
116
|
+
| `GITHUB_TOKEN`, `GH_TOKEN` | 只发送给 GitHub 主机;查看私有的上游仓库时需要 |
|
|
117
|
+
| `NO_COLOR`, `FORCE_COLOR` | 关闭或开启终端颜色 |
|
|
118
|
+
|
|
119
|
+
### 把 Markdown 报告和代码一起保存
|
|
120
|
+
|
|
121
|
+
```sh
|
|
122
|
+
npx @mcamdali/podexit --format markdown --output podexit.md
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Markdown 版本包含相同的表格、发布日期和指向各 Swift 包仓库的链接;来自本地路径和 git 的 pod 会折叠在一个 `<details>` 块中。
|
|
126
|
+
|
|
127
|
+
### 在脚本中使用 JSON 报告
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
npx @mcamdali/podexit --format json > podexit.json
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
每个 pod 都带有 `updates.status`、`swiftPackage.status`、trunk 上的最新版本及其日期,以及一句解释每个结论的话。其结构为 `schemaVersion` 0,在 1.0 之前可能发生变化。[examples/shell/frozen-pods.sh](examples/shell/frozen-pods.sh) 用 `jq` 对其进行过滤。
|
|
134
|
+
|
|
135
|
+
### 在 CI 中运行
|
|
136
|
+
|
|
137
|
+
[examples/github-actions/podexit.yml](examples/github-actions/podexit.yml) 会把报告添加到每个修改了 `Podfile.lock` 的 pull request 的作业摘要中。
|
|
138
|
+
|
|
139
|
+
### 速率限制与私有仓库
|
|
140
|
+
|
|
141
|
+
podexit 通过 raw.githubusercontent.com 读取 `Package.swift`,这不占用 GitHub API 配额。设置 `GITHUB_TOKEN`(或 `GH_TOKEN`)即可查看私有的上游仓库;令牌只会发送给 GitHub 主机。
|
|
142
|
+
|
|
143
|
+
### 在 JavaScript 中使用
|
|
144
|
+
|
|
145
|
+
```js
|
|
146
|
+
import {
|
|
147
|
+
analyzeLockfile,
|
|
148
|
+
buildReport,
|
|
149
|
+
CachedFetcher,
|
|
150
|
+
HttpFetcher,
|
|
151
|
+
loadPublisherPolicy,
|
|
152
|
+
render,
|
|
153
|
+
} from '@mcamdali/podexit';
|
|
154
|
+
|
|
155
|
+
const policy = loadPublisherPolicy();
|
|
156
|
+
const fetcher = new CachedFetcher(new HttpFetcher({ userAgent: 'my-tool' }), {
|
|
157
|
+
directory: '.cache',
|
|
158
|
+
});
|
|
159
|
+
const lockfile = await analyzeLockfile(text, 'ios/Podfile.lock', { fetcher, policy });
|
|
160
|
+
console.log(render(buildReport([lockfile], { policy, offline: false }), 'markdown'));
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
可运行的版本见 [examples/api/summary.mjs](examples/api/summary.mjs)。
|
|
164
|
+
|
|
165
|
+
## 演示
|
|
166
|
+
|
|
167
|
+
这三段录制来自 [fixtures](fixtures/README.md):它们是用各自工具链创建、并由 CocoaPods 1.16.2 解析的真实项目,使用 2026 年 10 月 14 日保存的响应回放。
|
|
168
|
+
|
|
169
|
+
| 项目 | 录制 |
|
|
170
|
+
| ---------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
|
171
|
+
| 原生 iOS 应用(Firebase、Alamofire、Google Sign-In) | 本页顶部 |
|
|
172
|
+
| Flutter 应用(FlutterFire、google_sign_in 等) | [浅色](docs/media/demo-flutter-light.svg) · [深色](docs/media/demo-flutter-dark.svg) |
|
|
173
|
+
| Expo SDK 57 应用(Sentry、RevenueCat、Lottie) | [浅色](docs/media/demo-expo-light.svg) · [深色](docs/media/demo-expo-dark.svg) |
|
|
174
|
+
|
|
175
|
+
测量环境:Mac(Apple silicon,M5 Max),Node.js 25.9,2026 年 10 月 14 日。在原生 fixture(28 个 pod)上首次运行发出 112 个请求,耗时 6.6 到 7.1 秒;第二次运行从缓存返回结果,耗时 0.3 秒。首次耗时主要取决于网速。
|
|
176
|
+
|
|
177
|
+
重新录制:`npm run demo`。
|
|
178
|
+
|
|
179
|
+
## 状态
|
|
180
|
+
|
|
181
|
+
| 功能 | 状态 |
|
|
182
|
+
| ------------------------------------------------------------- | ------------- |
|
|
183
|
+
| 读取 `Podfile.lock`:pod、subspec、依赖图、每个 pod 的来源 | 可用 |
|
|
184
|
+
| 来自 CocoaPods trunk 的最新版本和发布日期 | 可用 |
|
|
185
|
+
| 默认分支上以及锁定 tag 上的 `Package.swift` | 可用 |
|
|
186
|
+
| 发布方的版本上限(Firebase 12.x)及其子依赖 | 可用 |
|
|
187
|
+
| 识别原生、Flutter 应用、Flutter 插件、React Native 和 Expo | 可用 |
|
|
188
|
+
| 终端、Markdown 和 JSON 报告;`--offline` 缓存回放 | 可用 |
|
|
189
|
+
| 指出带来每个 pod 的 npm 或 pub.dev 包 | 计划中(0.3) |
|
|
190
|
+
| 每个 pod 对应的 Swift 包产品名称和版本,`plan` → MIGRATION.md | 计划中(0.5) |
|
|
191
|
+
| SARIF 输出、`--fail-on`、GitHub Action | 计划中(0.5) |
|
|
192
|
+
| 作者模式:podspec → `Package.swift` 起点 | 计划中(0.8) |
|
|
193
|
+
| Flutter `--fix`、静态网页、稳定的 JSON schema | 计划中(1.0) |
|
|
194
|
+
|
|
195
|
+
## 文档
|
|
196
|
+
|
|
197
|
+
API 参考与指南:[muhittincamdali.github.io/podexit](https://muhittincamdali.github.io/podexit/)。
|
|
198
|
+
|
|
199
|
+
## 指南
|
|
200
|
+
|
|
201
|
+
- [12 月 2 日会发生什么变化(以及哪些不变)](docs/guides/what-changes.md)
|
|
202
|
+
- [原生 iOS:从 CocoaPods 迁移到 Swift Package Manager](docs/guides/native-ios.md)
|
|
203
|
+
- [Flutter 应用与插件](docs/guides/flutter.md)
|
|
204
|
+
- [React Native 和 Expo](docs/guides/react-native-expo.md)
|
|
205
|
+
- [Firebase 12 之后](docs/guides/firebase.md)
|
|
206
|
+
- [pod 作者:替代 `pod trunk push`](docs/guides/pod-authors.md)
|
|
207
|
+
|
|
208
|
+
## 系统要求
|
|
209
|
+
|
|
210
|
+
| 工具链 | 最低版本 |
|
|
211
|
+
| ------- | -------- |
|
|
212
|
+
| Node.js | 22.12 |
|
|
213
|
+
|
|
214
|
+
CI 在 Node.js 22 和 24(Linux)上运行测试。在本地,测试已在 Mac(Apple silicon)上通过 Node.js 22.23、24.22 和 25.9 验证。
|
|
215
|
+
|
|
216
|
+
## 架构
|
|
217
|
+
|
|
218
|
+
```text
|
|
219
|
+
Podfile.lock ─► parseLockfile pods, subspecs, dependency graph, source per pod
|
|
220
|
+
─► classifyLockfile frozen-on-trunk | capped | not-affected | unknown
|
|
221
|
+
data/publisher-policy.json (sourced; Firebase 12.x)
|
|
222
|
+
─► analyzeLockfile per trunk pod, through a Fetcher:
|
|
223
|
+
cdn.cocoapods.org versions and podspec (GitHub repository and tag)
|
|
224
|
+
trunk.cocoapods.org release dates
|
|
225
|
+
raw.githubusercontent.com Package.swift at HEAD and at the locked tag
|
|
226
|
+
─► buildReport ─► render tty | markdown | json
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
- `src/core/` 是纯函数式的:解析、版本比较、分类,没有 I/O。
|
|
230
|
+
- 所有来自网络的数据都经过 `Fetcher`。`CachedFetcher` 为每个请求保存一个 JSON 文件;这些文件同时也是测试和 `--offline` 回放的已录制响应。
|
|
231
|
+
- 缺失的响应会连同原因一起报告为 `unknown`,而不是报错。
|
|
232
|
+
- CLI(`src/cli/`)只负责解析参数、查找 lockfile 和写出输出。
|
|
233
|
+
|
|
234
|
+
## 路线图
|
|
235
|
+
|
|
236
|
+
见[状态](#状态)表:0.3 增加每个 pod 背后的 npm 和 pub.dev 包,0.5 增加迁移计划、SARIF 和 GitHub Action,0.8 增加作者模式,1.0 提供稳定的 JSON schema。[CHANGELOG.md](CHANGELOG.md) 列出了每个版本的变更。
|
|
237
|
+
|
|
238
|
+
## 常见问题
|
|
239
|
+
|
|
240
|
+
**12 月 2 日之后我的应用会无法构建吗?** 不会。CocoaPods 和 Firebase 都表示,现有版本仍可安装。podexit 关注的是你将得不到的更新,而不是会失败的构建。
|
|
241
|
+
|
|
242
|
+
**为什么有的 pod 是“unknown”?** 它的 podspec 指向 GitHub 以外的主机(例如 dl.google.com 上的二进制文件),或者当时无法连接网络。JSON 和 Markdown 报告会按 pod 给出具体原因。
|
|
243
|
+
|
|
244
|
+
**为什么 Flutter 插件和 React Native 模块是“not affected”?** 它们是来自 `.symlinks/plugins` 或 `node_modules` 的本地路径 pod,通过 pub 或 npm 更新。它们所依赖的 SDK 会单独列出,那些 SDK 有可能已被冻结。
|
|
245
|
+
|
|
246
|
+
**podexit 会修改我的项目吗?** 不会。它读取 `Podfile.lock`,只写入自己的缓存和你要求的报告。
|
|
247
|
+
|
|
248
|
+
## 参与贡献
|
|
249
|
+
|
|
250
|
+
欢迎参与贡献。提交 pull request 之前,请先阅读 [CONTRIBUTING.md](CONTRIBUTING.md) 和[行为准则](https://github.com/muhittincamdali/.github/blob/main/CODE_OF_CONDUCT.md)。如发现安全问题,请按照 [SECURITY.md](SECURITY.md) 中的说明报告。
|
|
251
|
+
|
|
252
|
+
## 许可证
|
|
253
|
+
|
|
254
|
+
基于 MIT 许可证发布。详见 [LICENSE](LICENSE)。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./publisher-policy.schema.json",
|
|
3
|
+
"dataVersion": "2026.10.14",
|
|
4
|
+
"publishers": [
|
|
5
|
+
{
|
|
6
|
+
"id": "firebase",
|
|
7
|
+
"name": "Firebase",
|
|
8
|
+
"pods": [
|
|
9
|
+
"Firebase",
|
|
10
|
+
"FirebaseABTesting",
|
|
11
|
+
"FirebaseAI",
|
|
12
|
+
"FirebaseAILogic",
|
|
13
|
+
"FirebaseAnalytics",
|
|
14
|
+
"FirebaseAppCheck",
|
|
15
|
+
"FirebaseAppDistribution",
|
|
16
|
+
"FirebaseAuth",
|
|
17
|
+
"FirebaseCore",
|
|
18
|
+
"FirebaseCrashlytics",
|
|
19
|
+
"FirebaseDatabase",
|
|
20
|
+
"FirebaseFirestore",
|
|
21
|
+
"FirebaseFunctions",
|
|
22
|
+
"FirebaseInAppMessaging",
|
|
23
|
+
"FirebaseInstallations",
|
|
24
|
+
"FirebaseMLModelDownloader",
|
|
25
|
+
"FirebaseMessaging",
|
|
26
|
+
"FirebasePerformance",
|
|
27
|
+
"FirebaseRemoteConfig",
|
|
28
|
+
"FirebaseStorage"
|
|
29
|
+
],
|
|
30
|
+
"lastMajorOnCocoaPods": 12,
|
|
31
|
+
"stoppedPublishing": "2026-10",
|
|
32
|
+
"summary": "Firebase 12 is the final major version published to CocoaPods, and Firebase stops publishing new versions there in October 2026. Version 12 and earlier stay installable.",
|
|
33
|
+
"includesSubdependencies": true,
|
|
34
|
+
"swiftPackage": {
|
|
35
|
+
"url": "https://github.com/firebase/firebase-ios-sdk",
|
|
36
|
+
"note": "All Firebase libraries are products of the firebase-ios-sdk package."
|
|
37
|
+
},
|
|
38
|
+
"source": "https://firebase.google.com/docs/ios/cocoapods-deprecation",
|
|
39
|
+
"checked": "2026-10-14"
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|