summaryrefslogtreecommitdiffhomepage
path: root/vhosts/blog/public/posts/2025-04-24/composer-patches-v2-does-not-require-gnu-patch-even-on-macos/index.html
blob: d29bebb1616c4ebc988e6ddbf9f7e071974ebe36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<!DOCTYPE html>
<html lang="ja-JP">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="author" content="nsfisis">
    <meta name="copyright" content="&copy; 2025 nsfisis">
    <meta name="description" content="composer-patches は BSD patch に対応しておらず、一部のパッチの適用に失敗する。現在ベータ版である v2 では patch コマンドに依存しなくなり、macOS で使うときのストレスが解消される見込み。">
    <meta name="keywords" content="Composer,macOS,PHP">
    <meta property="og:type" content="article">
    <meta property="og:title" content="【Composer】 composer-patches v2 では macOS でも GNU patch のインストールが不要になる (予定)|REPL: Rest-Eat-Program Loop">
    <meta property="og:description" content="composer-patches は BSD patch に対応しておらず、一部のパッチの適用に失敗する。現在ベータ版である v2 では patch コマンドに依存しなくなり、macOS で使うときのストレスが解消される見込み。">
    <meta property="og:site_name" content="REPL: Rest-Eat-Program Loop">
    <meta property="og:locale" content="ja_JP">
    <link rel="icon" type="image/svg+xml" href="/favicon.svg">
    <title>【Composer】 composer-patches v2 では macOS でも GNU patch のインストールが不要になる (予定)|REPL: Rest-Eat-Program Loop</title>
    <link rel="stylesheet" href="/style.css?h=ad87bb00eb411fe20ba3a8366c69e490">
  </head>
  <body class="single">
    <header class="header">
      <div class="site-logo">
        <a href="/">REPL: Rest-Eat-Program Loop</a>
      </div>
      <nav class="nav">
        <ul>
          <li>
            <a href="/about/">About</a>
          </li>
          <li>
            <a href="/posts/">Posts</a>
          </li>
          <li>
            <a href="/slides/">Slides</a>
          </li>
          <li>
            <a href="/tags/">Tags</a>
          </li>
        </ul>
      </nav>
    </header>
    <main class="main">
      <article class="post-single">
        <header class="post-header">
          <h1 class="post-title">【Composer】 composer-patches v2 では macOS でも GNU patch のインストールが不要になる (予定)</h1>
          <ul class="post-tags">
            <li class="tag">
              <a href="/tags/composer/">Composer</a>
            </li>
            <li class="tag">
              <a href="/tags/macos/">macOS</a>
            </li>
            <li class="tag">
              <a href="/tags/php/">PHP</a>
            </li>
          </ul>
        </header>
        <div class="post-content">
          <section id="changelog">
            <h2><a href="#changelog">更新履歴</a></h2>
            <ol>
              <li class="revision">
                <time datetime="2025-04-10">2025-04-10</time>: デジタルサーカス株式会社の社内記事として公開
              </li>
              <li class="revision">
                <time datetime="2025-04-24">2025-04-24</time>: 公開
              </li>
            </ol>
          </section>
          <div class="admonition">
            <div class="admonition-label">
              NOTE
            </div>
            <div class="admonition-content">
              <p>
                この記事は、2025-04-10 に <a href="https://www.dgcircus.com/" rel="noreferrer" target="_blank">デジタルサーカス株式会社</a> の社内 Qiita Team に公開された記事をベースに、加筆修正して一般公開したものです。
              </p>
            </div>
          </div>
          <section id="section--intro">
            <h2><a href="#section--intro">はじめに</a></h2>
            <p>
              <a href="https://getcomposer.org/" rel="noreferrer" target="_blank">Composer</a> は PHP におけるデファクトスタンダードなパッケージ管理システムである。
            </p>
            <p>
              Composer を拡張するプラグインの一つに、<a href="https://github.com/cweagans/composer-patches" rel="noreferrer" target="_blank">composer-patches</a> という Composer パッケージがある。 これは、Composer でパッケージをインストールするときにそのパッケージへ任意のパッチを当てるプラグインである。
            </p>
            <p>
              社内で発見しすぐに適用しなければならないバグ修正や、Pull Request こそあるもののなかなかマージされない機能等をすぐさま適用してリリースすることができる。
            </p>
            <p>
              弊社でも多くのプロジェクトで活用されており、のべ数では数百ものパッチが当てられている。
            </p>
          </section>
          <section id="section--on-macos">
            <h2><a href="#section--on-macos">macOS での問題点</a></h2>
            <p>
              <code>composer-patches</code> は、macOS で一部のパッチの適用に失敗することが知られている。 関連 issues:
            </p>
            <ul>
              <li>
                <a href="https://github.com/cweagans/composer-patches/issues/522" rel="noreferrer" target="_blank">https://github.com/cweagans/composer-patches/issues/522</a>
              </li>
              <li>
                <a href="https://github.com/cweagans/composer-patches/issues/326" rel="noreferrer" target="_blank">https://github.com/cweagans/composer-patches/issues/326</a>
              </li>
            </ul>
            <p>
              これは、<code>composer-patches</code> の想定する <code>patch</code> コマンドが GNU 実装の patch であることに由来する。 macOS にプリインストールされている <code>patch</code> はいわゆる BSD patch であり、GNU patch とは完全な互換性がない。
            </p>
            <p>
              ワークアラウンドとして、macOS にも GNU patch をインストールしてしまうという方法がある。 例:
            </p>
            <div class="codeblock">
              <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>$ brew install gpatch</span></span>
<span class="line"><span>$ echo 'PATH="/opt/homebrew/opt/gpatch/libexec/gnubin:$PATH"' >> ~/.zshrc</span></span></code></pre>
            </div>
            <p>
              GNU patch を Homebrew などの手段でインストールし、BSD patch よりも優先されるパスに配置すれば問題が解消する。
            </p>
          </section>
          <section id="section--in-version-2">
            <h2><a href="#section--in-version-2">v2 では</a></h2>
            <p>
              現在ベータ版である <code>composer-patches</code> v2 では、このワークアラウンドが不要になる (見込み)。
            </p>
            <p>
              最新の実装では、<code>git apply</code> コマンドが最優先で使われる。 また、Git リポジトリがない場合 (<code>config.preferred-install</code> を <code>dist</code> に設定している場合など。デフォルトではそうなる) には <code>git init</code> を使って一時的にリポジトリを作成し、その上で <code>git apply</code> を実行するようになった。
            </p>
            <p>
              この変更により、環境ごとに差異のある <code>patch</code> コマンドへの依存がなくなるので、macOS で <code>composer-patches</code> を使うときの厄介事は解消されるものと思われる。
            </p>
            <p>
              <a href="https://github.com/cweagans/composer-patches/releases/tag/2.0.0-beta1" rel="noreferrer" target="_blank">2.0.0-beta1</a> のリリースノートより:
            </p>
            <blockquote>
              <ul>
                <li>
                  Only have git patchers and freeform patcher? by <a href="https://github.com/cweagans" rel="noreferrer" target="_blank"><strong>@cweagans</strong></a> in <a href="https://github.com/cweagans/composer-patches/pull/476" rel="noreferrer" target="_blank">#472</a>
                </li>
              </ul>
            </blockquote>
            <p>
              この変更で <code>patch</code> コマンドへの依存が排除された。
            </p>
          </section>
        </div>
      </article>
    </main>
    <footer class="footer">
      &copy; 2021 nsfisis
    </footer>
  </body>
</html>