M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

macOS環境でNuGetパッケージをプッシュする

さて、今回は前回記事よりはだいぶマシでした。正直に申し上げて今回の手順はこちらのQiita記事の内容とほとんど変わりありません。ただしちゃんとハマりどころはあるのでご安心いただきたいのです。

環境

環境については前回と変わりません。例によってどこからともなくやってきた(おそらくXamarinと同時にインストールされた)Mono v4.6.2がNuGetのランタイムとなります。

OS macOS Sierra (v10.12.1)
.NET Mono v4.6.2
NuGet v3.4.4
IDE Xamarin Studio Community v6.1.4

手順

前提として、すでに前回記事に示した手順でnupkgファイルが手元にあるものとします。

まずはNuGet Galleryにアカウントを作成します。サイト右上の「Register / Sign in」からアカウント作成もしくはログインのためのページにアクセスできます。

f:id:m12i:20161120222806p:plain

アカウントを作成すると登録したメールアドレスに確認のメール「[NuGet Gallery] Please verify your account.」が届きます。このメールに記載された一時URLをクリックしてWebページを表示するとアカウントの検証が済みます。これをしないとあとで使用するAPIキーが取得できません。

アカウントを作成したらアカウント情報ページにアクセスします。このページの一番下の方に「API Key」という欄があり「copy to clipboard」という部分をクリックすると、APIキーとなる文字列がクリップボードにコピーされます。このキーがあれば追加の認証なしに誰でも当該アカウント名義でパッケージをプッシュ(登録)できてしまうので、むやみにローカルに保存しないほうがいいでしょう。

f:id:m12i:20161120222919p:plain

そしてnuget pushコマンドを実行します。これによりパッケージがNuGet Galleryにプッシュ(登録)されます。

$ cd path/to/MyProject
$ ls
MyProject.csproj
MyProject.nuspec
MyProject.1.0.0.0.nupkg
Properties
bin
obj
...

$ mono path/to/nuget.exe push MyProject.1.0.0.0.nupkg \
  -Source https://www.nuget.org/api/v2/package \
  -ApiKey *****

冒頭で言及したQiita記事を読むと「NuGetによるプッシュ方法にはいろんな選択肢があるんだなー」なんて牧歌的とも言い切れないむしろ至極当然な気もする感想を抱いてしまいますが、そこは.NET on macOS。夢を見てはいけません。

上記の例の中でいうとまず-Sourceオプションを付けないと怒られます。nuget help pushコマンドで表示されるヘルプには、あえて指定されていない場合はデフォルトのURLを使ってNuGet Galleryあてにプッシュする云々の記述がありますが騙されてはいけません。指定しないとふつうにエラーになります。

また-ApiKeyオプションも必須でした。NuGetのヘルプにはnuget setapikeyなるデフォルトのキーをローカルに登録しておくためのコマンドが示されているのですが、こちらは実行しても無意味でした。Windows環境では機能するのでしょうけれど、私のmacOS環境ではだめでした。前述のQiita記事にもある「nuget setapikeyコマンドのあと-ApiKey指定無しでnuget pushコマンドを実行」という手順を行ったところnuget pushコマンドのあと(たぶん)NuGet Galleryのアカウント情報の入力を求められ、それも3回連続で入力をさせられたあとに結局401エラーでした。

PUT https://www.nuget.org/api/v2/package/
Unauthorized https://www.nuget.org/api/v2/package/ 453ms
401 (An API key must be provided in the 'X-NuGet-ApiKey' header to use this service)

まあなんにせよ。-Sourceオプションと-ApiKeyオプションをつけて、それからnupkgファイル名を引数にしてプッシュすれば、そこからはすんなり登録完了です。パッケージ管理ページを見ると最前プッシュしたパッケージが確認できると思います。ただしプッシュしてから数十分経たないとGalleryの検索インデックスにのらないようで(これはパッケージ管理ページから遷移できる個別のパッケージのページにも警告として表示されます)、XamarinのNuGetパッケージ検索にヒットするようになるまではしばし待機です。

ちなみに、さっそく2つのパッケージをプッシュしてみました。

m12i.hatenablog.com