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パッケージを追加して早速使おうとするのですが・・・
表示されません。(本当なら名前空間にSampleがあるはず)
どういうことでしょうか?
とりあえずNugetパッケージはできているのに名前空間が出てこないということは.dllが参照されていない可能性があります。
<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
してあげてパッケージを新しいのにしてあげれば・・・
はい、無事に追加出来ました。
結論
MacでNugetパッケージを作るときは絶対パスも../も使わない
以上、Macでnuget怪奇現象でした。