SDD(Sleep-Driven Development)

睡眠の重要性!!睡眠の重要性!!

MacでNuGetパッケージを作成するときの注意

MacでNugetパッケージ作ってたときハマったのでメモ

nugetのバージョンは3.4.4.1321

Macでもnugetコマンドを使えばNugetパッケージを作れるのですが若干罠めいたものがあります。

結論から先に言うと.nuspecは.slnと同じ階層でパスは相対パス



では実際に問題のあるやり方をしていきましょう。

とりあえず例としてXamarin StudioでXamarin.Formsライブラリプロジェクトを作成してSampleと名づけました。

これをNugetパッケージにするときプロジェクトの真下にいろいろ広げてもいいのですが、たとえば複数プロジェクトを対象とするときは.slnと同じ階層にディレクトリを作ってそこに.nuspecなどを置く人もいると思います。

今回はtoolsというディレクトリを作り、そこでnuget specで.nuspecファイルを作成し以下のように編集しました。

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>Sample</id>
    <version>1.0.0</version>
    <authors>Yamamoto</authors>
    <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
    <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
    <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Sample NuGet Package</description>
    <copyright>Copyright 2016</copyright>
    <tags>Sample</tags>
    <dependencies>
      <dependency id="Xamarin.Forms" version="2.3.1.114" />
    </dependencies>
  </metadata>
  <files>
    <file src="../Sample/bin/Debug/Sample.dll" target="lib"/>
  </files>
</package>

今回特にどこかで公開するようなパッケージではないのでlicenseUrlとかはデフォルトそのまま。

あとはnuget packしてあげればパッケージが作られます。

Kazuki:tools Yamamoto$ nuget pack Sample.nuspec -OutputDirectory ~/Nuget
'Sample.nuspec' からパッケージをビルドしています。
パッケージ '/Users/Yamamoto/Nuget/Sample.1.0.0.nupkg' が正常に作成されました。

私は~/Nugetに私物のNugetを置きXamarin Studioなどで参照させているので-OutputDirectoryオプションをつけています。

今回は特に問題なくパッケージが作成されました。

そして別プロジェクトでNugetパッケージを追加して早速使おうとするのですが・・・

f:id:crocus7724:20160910190400p:plain

表示されません。(本当なら名前空間にSampleがあるはず)

どういうことでしょうか?

とりあえずNugetパッケージはできているのに名前空間が出てこないということは.dllが参照されていない可能性があります。

相対パスがいけないのかということでsrcを絶対パスに。

<file src="/Users/Yamamoto/Projects/Sample/Sample/bin/Debug/Sample.dll" target="lib"/>

そしてまたnuget pack

Kazuki:tools Yamamoto$ nuget pack Sample.nuspec -OutputDirectory ~/Nuget
'Sample.nuspec' からパッケージをビルドしています。
Directory '/Users/Yamamoto/Projects/Sample/tools/Users/Yamamoto/Projects/Sample/Sample/bin/Debug' not found.

な に こ れ

なんと絶対パスで書いても相対パス扱いされてる。うーん意味がわからない。

なおNuspec Referenceのsrcの説明には

The location of the file or files to include. The path is relative to the NuSpec file unless an absolute path is specified.

とあります。私は英語苦手だけどGoogle先生の力を借りて読むと絶対パスを指定しない限り相対パスになるよとのこと。なら問題なく絶対パスが使えるはずなんだけど使えない辛い

なお解決方法は簡単です。諦めて.slnと同じ階層に.nuspecを置き

 <file src="Sample/bin/Debug/Sample.dll" target="lib"/>

にします。あとはnuget packしてあげてパッケージを新しいのにしてあげれば・・・

f:id:crocus7724:20160910190330p:plain

はい、無事に追加出来ました。

結論

MacでNugetパッケージを作るときは絶対パスも../も使わない

以上、Macでnuget怪奇現象でした。