<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>semver &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/semver/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>t32k、怒られる！セマンティック バージョニングしてますか？</title>
		<link>/t32k/11746/</link>
		<pubDate>Tue, 09 Dec 2014 02:00:29 +0000</pubDate>
		<dc:creator><![CDATA[石本 光司]]></dc:creator>
				<category><![CDATA[システム開発]]></category>
		<category><![CDATA[semver]]></category>

		<guid isPermaLink="false">/?p=11746</guid>
		<description><![CDATA[どうも、バンクーバーでぶらぶらしている@t32kです。最近は暇なのでもっぱらOSS活動に勤しんでおります。そんなわけで日々のアプリケーション開発において重要になってくるのがバージョニングです。 今日はセマンティック バー...]]></description>
				<content:encoded><![CDATA[<p>どうも、バンクーバーでぶらぶらしている<a href="https://twitter.com/t32k" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@t32k</a>です。最近は暇なのでもっぱらOSS活動に勤しんでおります。そんなわけで日々のアプリケーション開発において重要になってくるのがバージョニングです。</p>

<p>今日はセマンティック バージョニングについて解説します。自身が公開しているライブラリやパッケージのコードを何かしら修正したら、それに伴いバージョンを上げるのが一般的だと思うのですが、実はどのようにバージョンを上げるのが適切なのか、昔の私は理解していませんでした。</p>

<p>『いっぱい変更したのでメジャーバージョン上げてみるか』、『今回の修正は軽微なものだし、マイナーバージョンを上げるか』などと、なんとなくにバージョニングをしていました。</p>

<h2>t32k、怒られる！</h2>

<p><blockquote>If the plugin&#8217;s API changes dramatically (for example, when sortOrder option is renamed to config), there should be a major version update. See http://semver.org./</blockquote></p>

<ul>
<li><a href="https://github.com/csscomb/grunt-csscomb/issues/15" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Use semantic versioning · Issue #15 · csscomb/grunt-csscomb</a></li>
</ul>

<p>そんなときに起こったのが上記の事件です。<a href="https://github.com/csscomb/grunt-csscomb" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">grunt-csscomb</a>という私が管理しているGruntプラグインですが、そのアップデートの際に私がバージョニングを間違えてしまい、同じCSSCombチームのロシアのサンクトペテルブルク在住の青年エンジニアに怒られている悲惨な状況です。</p>

<p>彼の言い分は、「APIを変更したので、この場合はSemantic Versioningのルールに従ってメジャーバージョンを上げるべきであり、そうすることでユーザーも予測・対応しやすい」とのことです。</p>

<p>恥ずかしながら、この時初めてSemantic Versioningなるものを知りました。それよりも30歳も過ぎた大人がですね、地球の裏側ほど離れている、見たこともない青年に怒られている事実に私はへこみましたorz…</p>

<h2>セマンティック バージョニングの翻訳</h2>

<p>ということで、そのSemantic Versioningなるものを勉強してみました。</p>

<ul>
<li><a href="http://semver.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Semantic Versioning 2.0.0</a></li>
</ul>

<p>Semantic VersioningはGravatarsの考案者であり、GitHubの共同創設者でもあるTom Preston-Werner氏によって作成されました。去年、<a href="https://www.ruby-lang.org/ja/news/2013/12/21/ruby-version-policy-changes-with-2-1-0/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rubyのバージョニングにも導入</a>されて話題になってましたね。</p>

<p>勉強がてら翻訳して、先日プルリクエストがマージされましたので、現在日本語でも閲覧可能です。</p>

<ul>
<li><strong><a href="http://semver.org/lang/ja/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">セマンティック バージョニング 2.0.0</a></strong></li>
</ul>

<p>2度とですね、僕みたいな悲しいおっさんを増やしたくないので、皆さんもちゃんと読んでOSS活動しましょう。</p>

<h2>セマンティック バージョニングの導入</h2>

<p>詳細は公式サイトを見てもらえればよいのですが、なにせ長いですので、ざっくり、最低限、以下のことだけ覚えてください。</p>

<ol>
<li><strong>APIの変更に互換性のない場合は、メジャーバージョン上げる</strong></li>
<li><strong>後方互換性があり機能性を追加した場合は、マイナーバージョンを上げる</strong></li>
<li><strong>後方互換性を伴うバグ修正をした場合は、パッチバージョンを上げる</strong></li>
</ol>

<p>例えばVersion 3.2.1の場合、メジャーバージョンは3、マイナーバージョンは2、パッチバージョンは1ということになります。</p>

<p>一番重要なのはAPIに変更があった場合、メジャーバージョンを変更しなければならないということです。先のgrunt-csscombの件も<code>sortOrder</code>というオプション名を<code>config</code>に変更したので、このプラグインを使用しているユーザーはGruntfileを更新しなければならないケースが出てきます。</p>

<p>逆を言えば、セマンティック バージョニングが浸透しているコンテキストにおいては、メジャーバージョンのアップデートだけ気にしていれば、ユーザーは気軽に自身の依存しているパッケージをアップデートできるということです。</p>

<p>複雑なアプリケーションになればなるほど、依存するパッケージも多くなるので、それらをアップデートする際にちゃんと動作するのか、ひとつひとつ気に病むのは大変ですよね。セマンティック バージョニングという共通ルールは、そういった問題を解決するためにあります。</p>

<p>以前までのバージョンに対する私の一般的な印象は、大きければ大きいほど安定しているといったものでした。実際、そういった意味で商業的なバージョニングもあります（大した機能追加もないのに、大げさなバージョン名をつけるなど）。</p>

<p>例えば、Google Chromeは2014年12月現在バージョン39ですが、これはセマンティック バージョニングの観点から言えば、バージョン1.0でパブリックなAPIが定まってから38回もAPIが変更されたということになります（実際は<a href="http://blog.chromium.org/2010/07/release-early-release-often.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">高速リリースサイクル</a>のためですが&#8230;）。</p>

<p>そのため、セマンティック バージョニングにとってメジャーバージョンが大きいということは開発者にとっては、APIがコロコロ変わるということであまり好ましくない状況といえるかもしれません。</p>

<p>しかし、気軽に作成・公開したパッケージで、『やっぱりこのメソッド名イケてないわー変えたいわー』といような状況が考えられます。そのような場合、新旧のAPIを両方残し、旧APIをdeprecatedと宣言して、マイナーバージョンを上げるだけに留めたほうがよいでしょう。</p>

<p>実際、私の作っている<a href="https://html5experts.jp/t32k/5743/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSSの指標を計測するパッケージStyleStats</a>も、比較的軽微なAPIの変更を3回もしたため、あっという間にバージョンが4になってしまった経験があります。その都度、APIの変更がどういったものなのかユーザーに確認させるのは良くないことです。</p>

<p>そうゆうわけで、まとめますと、</p>

<ul>
<li>セマンティック バージョニングを守ろう</li>
<li><a href="http://efcl.info/2014/07/20/git-tag-to-release-github/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">リリースノートをちゃんと書こう</a></li>
</ul>

<p>です。ありがとございました。</p>

<p><strong>合わせて読みたい</strong></p>

<ul>
<li><a href="http://www.atmarkit.co.jp/fjava/column/andoh/andoh51.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">意外と知らないバージョン表記・数字の豆知識 &#8211; ＠IT</a></li>
</ul>
]]></content:encoded>
			</item>
	</channel>
</rss>
