Nuget ドキュメントに従って、MSBuild .targets および .props ファイルを含む nuget パッケージを作成しています(nuget 2.5 以降が必要です)。
自動パッケージ復元で使用する予定です。
結果のパッケージを csproj に追加すると、次の 2 つのことが起こります。
予想通り:
<Import Project="..\packages\MyPackage.1.0.0\build\net40\MyPackage.props" Condition="Exists('..\packages\MyPackage.1.0.0\build\net40\MyPackage.props')" />
...
...
<Import Project="..\packages\MyPackage.1.0.0\build\net40\MyPackage.targets" Condition="Exists('..\packages\MyPackage.1.0.0\build\net40\MyPackage.targets')" />
期待できません:
<PropertyGroup>
<RestorePackages>true</RestorePackages>
...
</PropertyGroup>
...
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
...
</Target>
これは、MSBuild 統合パッケージ復元スキャフォールディングの「予期しない」動作です。
ドキュメントに従ってこのスキャフォールディングを手動で削除しましたが、プロジェクトをビルド サーバーに送信すると、automaitc-package-restore によってスキャフォールディングが追加されたように見え、ビルドが失敗します。
This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is D:\TFSBuilds\...\.nuget\NuGet.targets.
パッケージに msbuild ターゲットが含まれている場合、この足場が含まれないようにする方法はありますか?
アップデート
解決策の代わりに、回避策を試しました。つまり、不足している nuget.targets ファイルに対処するために、別の nuget パッケージを作成しました。プロジェクトに追加すると、この新しいパッケージ自体に DependsOnTargets EnsureNuGetPackageBuildImports というターゲットが含まれ、空白/有効な nuget.targets が作成されます。これは、csproj スキャフォールディングからトリガーされた条件を満たしながら、ビルド サーバーで nuget 自動パッケージ復元機能を引き続きトリガーできるようにします。
<Target Name="NuGetPackAutomaticPackageRestorePreBuildWorkaround" BeforeTargets="EnsureNuGetPackageBuildImports" Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')">
<ItemGroup>
<PatchTargets Include="$(MSBuildThisFileDirectory)TargetPatches\*.targets"/>
</ItemGroup>
<Copy
SourceFiles="@(PatchTargets)"
DestinationFolder="$(SolutionDir)\.nuget\"/>
</Target>