-1
  1. 将项目(原始 VS 格式)转换为使用包引用。伟大的。

  2. 项目参考“不支持内容”。有问题的选择,虽然这里没有辩论。

  3. 一些使用过的包包含“内容”,不能或不会更新为使用“内容文件”。唔..

可以使用哪些半自动化工具/方法从“不支持 contentFiles” +的 NuGet 依赖项中复制“内容” ?只适用于直接包裹是可以的。


+当然,可以手动打开每个单独的 NuGet 文件并复制内容。这个问题不是关于“为什么”进行切换和/或任何优点或权衡和/或如何“应该”编写包。问题是关于能够将“内容”恢复到项目源代码树中的自动化或半自动化方法。

4

2 回答 2

1

可以将基于“内容”的 NuGet 包与已转换为使用包引用的原始 Visual Studio / MSBuild 项目一起使用。

所提出的解决方案也可能针对 SDK 风格的项目进行修改。该壮举是通过利用+GeneratePathProperty的属性来完成的。使用生成的路径属性可确保引用包的有效路径。(注意:如果包名中包含,请将其替换为属性名中的。)PackageReferencePkg*._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 配置。

于 2020-09-03T18:18:31.917 回答
-1

利用“包引用”为项目重新添加“内容”的工具或方法</p>

恐怕没有这样的工具可以将内容文件夹中的文件制作成具有PackageReference nuget 管理格式的项目。

作为包的用户,目前没有工具可以将内容文件夹的文件复制到带有PackageReference的项目中。

实际上,如果有这样的工具,也违反了nuget的机制。所有这些都取决于 nuget 包的作者而不是用户,除非该包是由我们编写的

建议

因此,您必须手动解压缩 nuget 包并将文件复制到您的项目中。

而且它似乎有点复杂,如果您仍然想获得一种简单的方法来获得您想要的东西,我建议您可以在我们的用户语音论坛上推荐一个功能。

在此处输入图像描述

之后,您可以在此处分享链接,任何对此感兴趣的人都会对其进行投票,以便获得更多微软的关注。所有这些都将有助于尽快获得您想要的东西。

于 2020-09-03T10:09:55.777 回答