ライブラリ開発者のためのおいしいナゲットの揚げ方
- 2. 自己紹介
azyobuzin / ぺぺたろう / ひゅいっ
Twitter, GitHub, etc: @azyobuzin
Blog: azyobuzin.hatenablog.com
C# と Python が好きっていう建前
PSO2: あじょぶじん @Ship4
エディタ: サクラエディタ, nano
のヮの<私、大きな事故はしたことない
- 10. 確認 Portable Class Library
プラットフォームをまたいで使えるライブラリ
例: ストアアプリでも Xamarin でも使える
.NET Framework クラスライブラリから共通するものだけを抽出
基本的に使いたい機能は大体無いと思うべし
クライアントアプリ開発では
プラットフォーム非依存のコードをまとめておく
ライブラリ開発では
共通して使えるメンバーを定義だけしておく
実装は各プラットフォーム向けアセンブリに任せよう(NuGetマジック)
- 14. 単一プラットフォーム
long compatibility = 0;
compatibility += CalculateVersionDistance(
projectFrameworkName.Version,
GetEffectiveFrameworkVersion(
projectFrameworkName, packageTargetFrameworkName,
portableProfileTable));
if (packageTargetFrameworkName.Profile.Equals(projectFrameworkName.Profile))
compatibility++;
if (packageTargetFrameworkName.Identifier.Equals(projectFrameworkName.Identifier))
compatibility += 10 * (1L << 32);
- 15. 単一プラットフォーム
long compatibility = 0;
compatibility += CalculateVersionDistance(
projectFrameworkName.Version,
GetEffectiveFrameworkVersion(
projectFrameworkName, packageTargetFrameworkName,
portableProfileTable));
if (packageTargetFrameworkName.Profile.Equals(projectFrameworkName.Profile))
compatibility++;
if (packageTargetFrameworkName.Identifier.Equals(projectFrameworkName.Identifier))
compatibility += 10 * (1L << 32);
バージョンが近いほど
大きな値に
プロファイルが同じなら
大きな値に
Client Profile 滅べ
PCL と差をつける
- 16. PCL(プロジェクトは単一プラットフォーム)
var compatibleFramework = packageFrameworkProfile.SupportedFrameworks
.FirstOrDefault(f => IsCompatible(projectFrameworkName, f, portableProfileTable));
var score = GetProfileCompatibility(projectFrameworkName, compatibleFramework,
portableProfileTable);
score -= (packageFrameworkProfile.SupportedFrameworks.Count * 2);
return score / 2;
- 17. PCL(プロジェクトは単一プラットフォーム)
var compatibleFramework = packageFrameworkProfile.SupportedFrameworks
.FirstOrDefault(f => IsCompatible(projectFrameworkName, f, portableProfileTable));
var score = GetProfileCompatibility(projectFrameworkName, compatibleFramework,
portableProfileTable);
score -= (packageFrameworkProfile.SupportedFrameworks.Count * 2);
return score / 2;
PCL でカバーしてるプラットフォームから
プロジェクトと互換性があるのを 1 つ取り出す
取り出したプラットフォームと
プロジェクトのプラットフォームで比較
カバーしてるプラットフォームの数だけ減点さらに減点
- 18. PCL(プロジェクトもPCL)
int nonMatchingCompatibleFrameworkCount = 0;
foreach (var supportedPackageTargetFramework in
packageTargetFrameworkProfile.SupportedFrameworks) {
var compatibleProjectFramework = projectFrameworkProfile.SupportedFrameworks
.FirstOrDefault(f => IsCompatible(f, supportedPackageTargetFramework,
portableProfileTable));
if (compatibleProjectFramework != null &&
compatibleProjectFramework.Version > supportedPackageTargetFramework.Version)
nonMatchingCompatibleFrameworkCount++;
}
int score = nonMatchingCompatibleFrameworkCount;
score = -(score * 50 + packageTargetFrameworkProfile.SupportedFrameworks.Count);
- 19. PCL(プロジェクトもPCL)
int nonMatchingCompatibleFrameworkCount = 0;
foreach (var supportedPackageTargetFramework in
packageTargetFrameworkProfile.SupportedFrameworks) {
var compatibleProjectFramework = projectFrameworkProfile.SupportedFrameworks
.FirstOrDefault(f => IsCompatible(f, supportedPackageTargetFramework,
portableProfileTable));
if (compatibleProjectFramework != null &&
compatibleProjectFramework.Version > supportedPackageTargetFramework.Version)
nonMatchingCompatibleFrameworkCount++;
}
int score = nonMatchingCompatibleFrameworkCount;
score = -(score * 50 + packageTargetFrameworkProfile.SupportedFrameworks.Count);
同一プラットフォームで
バージョンが違ったら減点
対応しているプラットフォームの
数だけ減点
大幅に減点
- 21. NuGetCalc
https://github.com/azyobuzin/NuGetCalc
NuGet でインストールされるアセンブリを予測するツール
おとといがんばってつくった
> NuGetCalc CoreTweet portable-win8+wpa81
.NETPortable,Version=v0.0,Profile=net4+sl5+wp8+win8+wpa81+MonoAndroid+MonoTouch
> NuGetCalc -v CoreTweet net45
.NETFramework,Version=v4.5 180388626433
.NETFramework,Version=v4.0 180388301308
.NETFramework,Version=v3.5 180372045058
.NETPortable,Version=v0.0,Profile=net45+MonoAndroid+MonoTouch 90194313213
.NETPortable,Version=v0.0,Profile=net4+sl5+wp8+win8+wpa81+MonoAndroid+MonoTouch
90194150647