可以将基于“内容”的 NuGet 包与已转换为使用包引用的原始 Visual Studio / MSBuild 项目一起使用。
所提出的解决方案也可能针对 SDK 风格的项目进行修改。该壮举是通过利用+GeneratePathProperty
的属性来完成的。使用生成的路径属性可确保引用包的有效路径。(注意:如果包名中包含,请将其替换为属性名中的。)PackageReference
Pkg*
.
_
Pkg*
首先,在GeneratePathProperty
所有包含要复制或链接的内容的包中添加一个。
<PackageReference Include="bootstrap" GeneratePathProperty="true">
<Version>Don't ask..</Version>
</PackageReference>
<PackageReference Include="AngularJS.Core" GeneratePathProperty="true">
<Version>..it's not great</Version>
</PackageReference>
“获取内容”
根据需要,这里介绍了两种不同的方法。虽然这些方法可以一起使用,但任何一种方法都不应应用于基于“内容文件”的 NuGet 包。
方法 #1:将内容复制到项目源
使用这种方法,可以将文件添加到源代码管理中。因此,在更新包时可以取消注释(并重新注释)项目中的以下行,以确保最新的 NuGet 包内容。
它使用Copy
任务来复制内容。
<ItemGroup>
<NugetContentToRestore Include="
$(Pkgbootstrap)\Content\**\*.*;
$(PkgAngularJS_Core)\Content\**\*.*;
" />
</ItemGroup>
<Target Name="BeforeBuild">
<Copy SourceFiles="@(NugetContentToRestore)"
DestinationFiles="@(NugetContentToRestore->'$(ProjectDir)\%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>
如果在正常开发的时候没有将ItemGroup注释掉的话,项目会被包含在项目的解决方案资源管理器根目录下,有点丑陋。也无法检测“内容”何时被删除。
方法#2:内容链接
如果没有任何内容要与项目一起复制和/或签入源代码管理,也可以链接。这种方法的好处是始终链接最新的内容,并且不会污染解决方案资源管理器。
项目中明确包含的本地文件将优先于链接的资源。
对于普通项目(和 bin 部署的文件)
对于普通项目,<CopyToOutputDirectory>
就足够了,链接的文件将进入“bin”输出。但是,这不适用于仅理解项目树中物理存在的文件的 Web 项目。
<ItemGroup>
<Content Include="$(Pkgbootstrap)\Content\**\*.*">
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="$(PkgAngularJS_Core)\Content\**\*.*">
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
对于 Web 项目(需要本地文件)
对于 Web 项目,必须将这些链接复制到本地文件:<CopyToOutputDirectory>
不够或不需要。包含应进入 bin 输出的内容的包应使用上述方法。
<ItemGroup>
<Content Include="$(Pkgbootstrap)\Content\**\*.*">
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
</Content>
<Content Include="$(PkgAngularJS_Core)\Content\**\*.*">
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
</Content>
</ItemGroup>
然后添加一个目标来复制链接的文件,以便 Web 项目工具拾取它们。请参阅使用 MSBuild 在每次构建时复制链接的内容文件。它可能是相关的,因此跳过某些链接并添加源代码控制忽略条目。
<Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
<Copy SourceFiles="%(Content.Identity)"
DestinationFiles="%(Content.Link)"
SkipUnchangedFiles='true'
OverwriteReadOnlyFiles='true'
Condition="'%(Content.Link)' != ''" />
</Target>
+这适用于最新的 Visual Studio 2019 环境。Pkg*
由于需要生成属性,因此它可能不适用于某些较旧的 MSBuild/NuGet 配置。