@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.fr.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="État de la 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="Dernière version: 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="Version du langage: 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="Licence: MIT"></picture></a>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<a href="#démarrage-rapide"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-fr-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-fr-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-fr-light.svg" alt="Commencer"></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-fr-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-docs-fr-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-docs-fr-light.svg" alt="Documentation"></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-fr-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-guides-fr-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-guides-fr-light.svg" alt="Guides"></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-fr-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-examples-fr-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-examples-fr-light.svg" alt="Exemples"></picture></a>
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
> Ceci est une traduction du README anglais. En cas de différence, la version anglaise fait foi.
|
|
25
|
+
|
|
26
|
+
<!-- brand:end -->
|
|
27
|
+
|
|
28
|
+
CocoaPods trunk passera en lecture seule le 2 décembre 2026. Vos builds continueront de fonctionner, mais les pods publiés sur trunk ne recevront plus jamais de mise à jour. podexit vous montre lesquelles de vos dépendances sont figées, lesquelles proposent déjà un paquet Swift, et le chemin de migration pour iOS natif, Flutter et React Native/Expo. Il lit le `Podfile.lock` que vous avez déjà ; rien n’est installé dans votre projet.
|
|
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 exécuté sur une application iOS native : pods Firebase plafonnés à 12.x ; Alamofire, Kingfisher, SnapKit et d’autres figés après le 2 décembre, chacun avec un paquet Swift"></picture>
|
|
31
|
+
|
|
32
|
+
<sub>Enregistré avec la vraie CLI sur le <a href="fixtures/native-app/Podfile">fixture native-app</a>, avec les réponses de trunk et de GitHub sauvegardées le 14 octobre 2026 (<code>npm run demo</code>).</sub>
|
|
33
|
+
|
|
34
|
+
## Points forts
|
|
35
|
+
|
|
36
|
+
- **Deux réponses par pod** : s’il cesse de recevoir des mises à jour (figé sur trunk, plafonné plus tôt par son éditeur, ou non concerné) et si son dépôt amont contient un `Package.swift`.
|
|
37
|
+
- **Attentif aux versions** : vérifie aussi le `Package.swift` au tag que vous avez verrouillé et signale quand le paquet Swift n’existe que dans des versions plus récentes.
|
|
38
|
+
- **Plafond Firebase intégré** : les 20 pods listés par Firebase sont plafonnés à 12.x, ainsi que leurs sous-dépendances, à partir d’un fichier de données sourcé qui cite la page de Firebase.
|
|
39
|
+
- **Natif, Flutter, React Native et Expo** : trouve `Podfile.lock` dans le dossier ou dans `ios/`, `macos/`, `example/ios/` ou `example/macos/`, reconnaît le type de projet et renvoie vers le guide correspondant.
|
|
40
|
+
- **Terminal, Markdown ou JSON** : un tableau pour vous, du Markdown pour une pull request, du JSON pour les scripts.
|
|
41
|
+
- **Fonctionne hors ligne** : les réponses sont mises en cache 24 heures dans `~/.cache/podexit` ; `--offline` n’utilise que le cache.
|
|
42
|
+
|
|
43
|
+
## Démarrage rapide
|
|
44
|
+
|
|
45
|
+
Il vous faut [Node.js](https://nodejs.org/) 22.12 ou plus récent (`node --version` affiche la version ; sur un Mac, `brew install node` l’installe). Rien d’autre.
|
|
46
|
+
|
|
47
|
+
**1. Ouvrez un terminal dans le dossier de votre application**, celui qui contient le `Podfile`, le dossier `ios/` ou (pour un plugin Flutter) le dossier `example/` :
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
cd path/to/YourApp
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**2. Lancez podexit :**
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
npx @mcamdali/podexit
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Le paquet npm s’appelle `@mcamdali/podexit` (npm a refusé le nom sans portée) ; la commande qu’il installe reste `podexit`.
|
|
60
|
+
|
|
61
|
+
**3. Lisez le tableau.** Les lignes marquées **capped** s’arrêtent en premier (Firebase cesse de publier sur CocoaPods en octobre 2026) ; celles marquées **frozen after Dec 2** ne reçoivent plus de nouvelles versions après le 2 décembre. Quand la colonne Swift package indique **yes**, le pod peut être migré dès maintenant. La dernière ligne renvoie vers le guide correspondant à votre type de projet.
|
|
62
|
+
|
|
63
|
+
## Ce qui change le 2 décembre (et ce qui ne change pas)
|
|
64
|
+
|
|
65
|
+
D’après l'[annonce de CocoaPods](https://blog.cocoapods.org/CocoaPods-Specs-Repo/) et la [page de migration de Firebase](https://firebase.google.com/docs/ios/cocoapods-deprecation) :
|
|
66
|
+
|
|
67
|
+
1. **Les builds continuent de fonctionner.** Le dépôt Specs et le CDN restent en ligne ; `pod install` continue de résoudre toutes les versions déjà publiées. Un essai du mode lecture seule a lieu du 1er au 7 novembre 2026.
|
|
68
|
+
2. **Les pods sur trunk ne reçoivent plus de nouvelles versions** après le 2 décembre 2026, correctifs de sécurité compris, sauf s’ils sont distribués autrement (le plus souvent sous forme de paquet Swift).
|
|
69
|
+
3. **Firebase 12 est la dernière version majeure sur CocoaPods**, et Firebase cesse d’y publier en octobre 2026. Les versions 12 et antérieures restent installables.
|
|
70
|
+
|
|
71
|
+
Pour en savoir plus, lisez [Ce qui change le 2 décembre](docs/guides/what-changes.md).
|
|
72
|
+
|
|
73
|
+
## Installation
|
|
74
|
+
|
|
75
|
+
Exécutez-le sans installation, ou ajoutez-le à un projet pour figer une version :
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
npm install --save-dev @mcamdali/podexit
|
|
79
|
+
npx @mcamdali/podexit
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Pour installer la commande globalement :
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
npm i -g @mcamdali/podexit
|
|
86
|
+
podexit
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Avec Homebrew, `brew install muhittincamdali/tap/podexit` installe l’archive de la version publiée sur GitHub.
|
|
90
|
+
|
|
91
|
+
## Utilisation
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
podexit [paths...] [options]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
| Option | Effet |
|
|
98
|
+
| ----------------------- | --------------------------------------------------------------------------------------- |
|
|
99
|
+
| `paths` | Fichiers `Podfile.lock` ou dossiers de projet ; par défaut, le dossier courant |
|
|
100
|
+
| `-f, --format <format>` | `tty` (par défaut), `markdown` ou `json` |
|
|
101
|
+
| `-o, --output <file>` | Écrit le rapport dans un fichier au lieu du terminal |
|
|
102
|
+
| `-a, --all` | Liste aussi dans le tableau les pods issus de chemins locaux, de git et de specs privés |
|
|
103
|
+
| `--offline` | N’utilise que les réponses en cache ; ne touche jamais au réseau |
|
|
104
|
+
| `--refresh` | Ignore le cache et interroge de nouveau le réseau |
|
|
105
|
+
| `--cache-dir <dir>` | Dossier de cache (par défaut `$XDG_CACHE_HOME/podexit` ou `~/.cache/podexit`) |
|
|
106
|
+
| `--no-color` | Texte brut même dans un terminal (`NO_COLOR` et `FORCE_COLOR` sont respectés) |
|
|
107
|
+
| `--concurrency <n>` | Requêtes de pods en parallèle, de 1 à 64 (par défaut 8) |
|
|
108
|
+
|
|
109
|
+
Codes de sortie : `0` rapport écrit, `2` arguments invalides, aucun `Podfile.lock` trouvé ou fichier qui n’en est pas un, `1` tout le reste. podexit rapporte ; il ne fait pas échouer un build à cause de ce qu’il trouve.
|
|
110
|
+
|
|
111
|
+
Sans chemin, podexit lit chaque lockfile trouvé parmi `Podfile.lock`, `ios/Podfile.lock`, `macos/Podfile.lock`, `example/ios/Podfile.lock` et `example/macos/Podfile.lock` ; un dossier passé comme chemin est parcouru de la même façon.
|
|
112
|
+
|
|
113
|
+
| Variable d’environnement | Effet |
|
|
114
|
+
| -------------------------- | ---------------------------------------------------------------------------- |
|
|
115
|
+
| `PODEXIT_CACHE_DIR` | Dossier de cache quand `--cache-dir` n’est pas indiqué |
|
|
116
|
+
| `GITHUB_TOKEN`, `GH_TOKEN` | Envoyé uniquement aux hôtes GitHub ; nécessaire pour les dépôts amont privés |
|
|
117
|
+
| `NO_COLOR`, `FORCE_COLOR` | Désactive ou active les couleurs du terminal |
|
|
118
|
+
|
|
119
|
+
### Conserver un rapport Markdown avec le code
|
|
120
|
+
|
|
121
|
+
```sh
|
|
122
|
+
npx @mcamdali/podexit --format markdown --output podexit.md
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
La version Markdown contient les mêmes tableaux, les dates de publication et les liens vers le dépôt de chaque paquet Swift ; les pods issus de chemins locaux et de git sont regroupés dans un bloc `<details>`.
|
|
126
|
+
|
|
127
|
+
### Utiliser le rapport JSON dans des scripts
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
npx @mcamdali/podexit --format json > podexit.json
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Chaque pod porte `updates.status`, `swiftPackage.status`, la dernière version sur trunk avec sa date, et une phrase qui explique chaque réponse. La structure est `schemaVersion` 0 et peut changer avant la 1.0. [examples/shell/frozen-pods.sh](examples/shell/frozen-pods.sh) la filtre avec `jq`.
|
|
134
|
+
|
|
135
|
+
### L’exécuter en CI
|
|
136
|
+
|
|
137
|
+
[examples/github-actions/podexit.yml](examples/github-actions/podexit.yml) ajoute le rapport au résumé du job de chaque pull request qui modifie un `Podfile.lock`.
|
|
138
|
+
|
|
139
|
+
### Limites de débit et dépôts privés
|
|
140
|
+
|
|
141
|
+
podexit lit `Package.swift` via raw.githubusercontent.com, qui ne consomme pas le quota de l’API GitHub. Définissez `GITHUB_TOKEN` (ou `GH_TOKEN`) pour consulter des dépôts amont privés ; le jeton n’est envoyé qu’aux hôtes GitHub.
|
|
142
|
+
|
|
143
|
+
### Depuis 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
|
+
Une version exécutable se trouve dans [examples/api/summary.mjs](examples/api/summary.mjs).
|
|
164
|
+
|
|
165
|
+
## Démo
|
|
166
|
+
|
|
167
|
+
Les trois enregistrements proviennent des [fixtures](fixtures/README.md) : de vrais projets créés avec chaque toolchain et résolus par CocoaPods 1.16.2, rejoués avec les réponses sauvegardées le 14 octobre 2026.
|
|
168
|
+
|
|
169
|
+
| Projet | Enregistrement |
|
|
170
|
+
| ------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
|
|
171
|
+
| Application iOS native (Firebase, Alamofire, Google Sign-In) | en haut de cette page |
|
|
172
|
+
| Application Flutter (FlutterFire, google_sign_in, …) | [clair](docs/media/demo-flutter-light.svg) · [sombre](docs/media/demo-flutter-dark.svg) |
|
|
173
|
+
| Application Expo SDK 57 (Sentry, RevenueCat, Lottie) | [clair](docs/media/demo-expo-light.svg) · [sombre](docs/media/demo-expo-dark.svg) |
|
|
174
|
+
|
|
175
|
+
Mesuré sur un Mac (Apple silicon, M5 Max) avec Node.js 25.9 le 14 octobre 2026 : une première exécution sur le fixture natif (28 pods) a envoyé 112 requêtes et pris de 6,6 à 7,1 secondes ; une seconde exécution a répondu depuis le cache en 0,3 seconde. La vitesse du réseau détermine l’essentiel du premier chiffre.
|
|
176
|
+
|
|
177
|
+
Pour les enregistrer de nouveau : `npm run demo`.
|
|
178
|
+
|
|
179
|
+
## État
|
|
180
|
+
|
|
181
|
+
| Fonctionnalité | État |
|
|
182
|
+
| --------------------------------------------------------------------------------------- | ----------- |
|
|
183
|
+
| Lecture de `Podfile.lock` : pods, subspecs, graphe de dépendances, source de chaque pod | fonctionne |
|
|
184
|
+
| Dernière version et dates de publication depuis CocoaPods trunk | fonctionne |
|
|
185
|
+
| `Package.swift` sur la branche par défaut et au tag verrouillé | fonctionne |
|
|
186
|
+
| Plafonds des éditeurs (Firebase 12.x) et leurs sous-dépendances | fonctionne |
|
|
187
|
+
| Détection de natif, application Flutter, plugin Flutter, React Native et Expo | fonctionne |
|
|
188
|
+
| Rapports terminal, Markdown et JSON ; rejeu du cache avec `--offline` | fonctionne |
|
|
189
|
+
| Nommer le paquet npm ou pub.dev qui apporte chaque pod | prévu (0.3) |
|
|
190
|
+
| Noms de produits et versions du paquet Swift par pod, `plan` → MIGRATION.md | prévu (0.5) |
|
|
191
|
+
| Sortie SARIF, `--fail-on`, GitHub Action | prévu (0.5) |
|
|
192
|
+
| Mode auteur : podspec → point de départ de `Package.swift` | prévu (0.8) |
|
|
193
|
+
| `--fix` pour Flutter, page web statique, schéma JSON stable | prévu (1.0) |
|
|
194
|
+
|
|
195
|
+
## Documentation
|
|
196
|
+
|
|
197
|
+
Référence de l’API et guides : [muhittincamdali.github.io/podexit](https://muhittincamdali.github.io/podexit/).
|
|
198
|
+
|
|
199
|
+
## Guides
|
|
200
|
+
|
|
201
|
+
- [Ce qui change le 2 décembre (et ce qui ne change pas)](docs/guides/what-changes.md)
|
|
202
|
+
- [iOS natif : de CocoaPods à Swift Package Manager](docs/guides/native-ios.md)
|
|
203
|
+
- [Applications et plugins Flutter](docs/guides/flutter.md)
|
|
204
|
+
- [React Native et Expo](docs/guides/react-native-expo.md)
|
|
205
|
+
- [Firebase après la version 12](docs/guides/firebase.md)
|
|
206
|
+
- [Auteurs de pods : remplacer `pod trunk push`](docs/guides/pod-authors.md)
|
|
207
|
+
|
|
208
|
+
## Prérequis
|
|
209
|
+
|
|
210
|
+
| Toolchain | Version minimale |
|
|
211
|
+
| --------- | ---------------- |
|
|
212
|
+
| Node.js | 22.12 |
|
|
213
|
+
|
|
214
|
+
La CI exécute les tests sur Node.js 22 et 24 (Linux). En local, ils passent sur Node.js 22.23, 24.22 et 25.9, sur un Mac (Apple silicon).
|
|
215
|
+
|
|
216
|
+
## Architecture
|
|
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/` est pur : analyse, comparaison de versions, classification. Aucune E/S.
|
|
230
|
+
- Tout ce qui vient du réseau passe par un `Fetcher`. `CachedFetcher` stocke un fichier JSON par requête ; ces mêmes fichiers sont les réponses enregistrées que rejouent les tests et `--offline`.
|
|
231
|
+
- Une réponse manquante est signalée comme `unknown`, avec la raison, jamais comme une erreur.
|
|
232
|
+
- La CLI (`src/cli/`) ne fait qu’analyser les arguments, trouver les lockfiles et écrire la sortie.
|
|
233
|
+
|
|
234
|
+
## Feuille de route
|
|
235
|
+
|
|
236
|
+
Voir le tableau [État](#état) : la 0.3 ajoute le paquet npm et pub.dev derrière chaque pod, la 0.5 le plan de migration, SARIF et une GitHub Action, la 0.8 le mode auteur, la 1.0 un schéma JSON stable. [CHANGELOG.md](CHANGELOG.md) liste ce que chaque version a changé.
|
|
237
|
+
|
|
238
|
+
## FAQ
|
|
239
|
+
|
|
240
|
+
**Mon application cessera-t-elle de compiler le 2 décembre ?** Non. CocoaPods comme Firebase indiquent que les versions existantes restent installables. podexit s’intéresse aux mises à jour que vous ne recevrez pas, pas aux builds qui s’arrêteraient.
|
|
241
|
+
|
|
242
|
+
**Pourquoi un pod est-il « unknown » ?** Son podspec pointe vers un hôte autre que GitHub (par exemple un binaire sur dl.google.com), ou le réseau n’était pas disponible. Les rapports JSON et Markdown donnent la raison pour chaque pod.
|
|
243
|
+
|
|
244
|
+
**Pourquoi les plugins Flutter et les modules React Native sont-ils « not affected » ?** Ce sont des pods à chemin local issus de `.symlinks/plugins` ou de `node_modules` ; ils se mettent à jour avec pub ou npm. Les SDK dont ils dépendent sont listés séparément, et ceux-là peuvent être figés.
|
|
245
|
+
|
|
246
|
+
**podexit modifie-t-il mon projet ?** Non. Il lit `Podfile.lock` et n’écrit que son cache et le rapport que vous demandez.
|
|
247
|
+
|
|
248
|
+
## Contribuer
|
|
249
|
+
|
|
250
|
+
Les contributions sont les bienvenues. Lisez [CONTRIBUTING.md](CONTRIBUTING.md) et le [code de conduite](https://github.com/muhittincamdali/.github/blob/main/CODE_OF_CONDUCT.md) avant d’ouvrir une pull request. Signalez les problèmes de sécurité comme indiqué dans [SECURITY.md](SECURITY.md).
|
|
251
|
+
|
|
252
|
+
## Licence
|
|
253
|
+
|
|
254
|
+
Publié sous licence MIT. Voir [LICENSE](LICENSE).
|
package/README.ja.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-ja-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-ja-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-start-ja-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-ja-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-docs-ja-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-docs-ja-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-ja-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-guides-ja-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-guides-ja-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-ja-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-examples-ja-light.svg"><img src="https://raw.githubusercontent.com/muhittincamdali/podexit/main/.github/brand/button-examples-ja-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="ネイティブ iOS アプリで実行した podexit: 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 ごとに 2 つの答え**: アップデートが止まるかどうか(trunk で凍結、公開元によって早期に上限が設定、または影響なし)と、上流リポジトリに `Package.swift` があるかどうか。
|
|
37
|
+
- **バージョンを考慮**: ロックしているタグ時点の `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** は、別の方法(多くは Swift パッケージ)で配布されない限り、2026年12月2日以降、セキュリティ修正を含めて新しいバージョンが出ません。
|
|
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 のリリース tarball がインストールされます。
|
|
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
|
+
3 つの録画は [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 秒かかりました。2 回目はキャッシュから 0.3 秒で応答しました。初回の時間はほとんどがネットワーク速度で決まります。
|
|
176
|
+
|
|
177
|
+
録画をやり直すには `npm run demo` を実行します。
|
|
178
|
+
|
|
179
|
+
## ステータス
|
|
180
|
+
|
|
181
|
+
| 機能 | ステータス |
|
|
182
|
+
| ---------------------------------------------------------------------------- | ------------- |
|
|
183
|
+
| `Podfile.lock` の読み取り: pod、subspec、依存グラフ、各 pod の取得元 | 動作 |
|
|
184
|
+
| CocoaPods trunk からの最新バージョンとリリース日 | 動作 |
|
|
185
|
+
| デフォルトブランチおよびロックしたタグ時点の `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`、静的 Web ページ、安定した JSON スキーマ | 計画中(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` はリクエストごとに 1 つの 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 スキーマが加わります。各リリースの変更内容は [CHANGELOG.md](CHANGELOG.md) にまとめています。
|
|
237
|
+
|
|
238
|
+
## FAQ
|
|
239
|
+
|
|
240
|
+
**12月2日にアプリのビルドが通らなくなりますか?** いいえ。CocoaPods も Firebase も、既存のバージョンはインストールできるままだと説明しています。podexit が扱うのは、受け取れなくなるアップデートであり、止まってしまうビルドではありません。
|
|
241
|
+
|
|
242
|
+
**なぜ「unknown」になる pod があるのですか?** その podspec が GitHub 以外のホスト(たとえば dl.google.com 上のバイナリ)を指しているか、ネットワークが利用できなかったためです。JSON と Markdown のレポートには、pod ごとの理由が記載されます。
|
|
243
|
+
|
|
244
|
+
**なぜ Flutter プラグインや React Native モジュールは「not affected」なのですか?** これらは `.symlinks/plugins` または `node_modules` にあるローカルパスの pod で、pub や npm 経由で更新されます。それらが依存する 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) を参照してください。
|