MSBuild Targetを一括インポートしてオプションでアセンブリ/ツール/コンテンツのNuGet Packageを作成するMSBuild TargetのNuGet Packageを作った
前回は、一つのMSBuild TargetをインポートするMSBuild TargetのNuGet Packageを作ったが、元々一番やりたかったのは、アセンブリ/コンテンツのNuGet Packageを作成するMSBuild TargetをインポートするNuGet Package・・・
「相変わらずややこしくてすみません・・・」
しかし、コンテンツの中には、MSBuild Targetもあるわけで、それが幾つもガンガンとプロジェクトに突っ込まれるのが嫌なのは、前回書いた通り。
そこで・・・
- MSBuildTasks.ImportTasksにアセンブリ/ツール/コンテンツのNuGet Packageを作成するMSBuild Targetを突っ込んだ
- MSBuildTasks.ImportTasksにMSBuildTasks.ImportedTaskを読み込むインポート文を仕込んだ
- MSBuildTasks.ImportedTaskにアセンブリ/ツール/コンテンツのNuGet Packageを作成するMSBuild Targetの動作を変えるプロパティを仕込んだ
- MSBuildTasks.ImportedTaskにtargetsフォルダのターゲットファイルを全部読み込むインポート文を仕込んだ
- MSBuildTasks.ImportTasksのパッケージ化は独自のターゲットは廃止して、リポジトリのbuildフォルダに突っ込むMSBuildTasks.ImportTasks自身で実行するようにした
ソースは、GitHubに上げています。
https://github.com/tmori3y2/BlogSamples/tree/Article_20160402
使い方
- NuGetPackages/NuGetDeployの作業フォルダをNuGet Package Sourcesに追加
- .csprojを作成
- コンテンツはクラスライブラリで作成すること
- MSBuildTasks.ImportTasksをインストール
- build\MSBuildTasks.ImportedTask.propsを開いて、コメントを参考にプロパティを編集
- パッケージ化しないならCreatesNuGetPackageはfalse
MSBuild project property sheet file which is imported by MSBuildTasks.ImportTasks.props.
ターゲットを追加する方法
- MSBuildTasks.ImportedTaskに直接書く
- targetsフォルダに.props/.targetsファイルを置く
- TestプロジェクトにWarningを出すだけのターゲットを入れています
- buildフォルダに.props/.targetsファイルを置いて、MSBuildTasks.ImportedTaskにImport文を書く
- ターゲットを修正/追加したら、ソリューションを閉じて、開きなおす
- プロジェクトを編集せずにリロードしてもImport文の再評価はされないことが多いので、ソリューションの開きなおしが確実です
パッケージ化する方法
- Debugで一回ビルド
- .nuspecファイルがなければ出来ているので追加して編集
- ビルドしたアセンブリやアセンブリのツールをパッケージ化するなら、AssemblyInfo.csをビルドエラーが出なくなるまで修正
- コンテンツをパッケージするなら、.nuspecファイルのプレースフォルダは全て手で書き換える
- bin\Debugに出来たパッケージを7zipなどで開いて確認
- 良ければReleaseビルドでNuGetPackages/NuGetDeployの作業フォルダにコピーされるのでインストールテスト
- NuGetPackages/NuGetDeployの作業フォルダに同じバージョンがあったらエラーにしています。理由はそのうちブログのネタにします
MSBuildはまじめにやり始めて2~3週間なので、まだまだですが、今日はこの辺でご勘弁を・・・
ちなみに、VS2013.5/NuGet v2.8.6です。
参考資料