簡體   English   中英

在使用 .NET Framework 4.8 項目時,將 NuGet Package 內容標記為“復制到輸出”

[英]Mark NuGet Package content as “Copy to Output” in consuming .NET Framework 4.8 project

我有一個 .NET 標准 2.0 項目,該項目在構建時被打包到 NuGet package 中。 (使用 .csproj 方法在構建時生成 package)此項目包含一個文件ApiClientSettings.json ,我想將其復制到 Z78E6221F6393D1356681DB398F14CE6 的消費項目目錄

我在 my.csproj 中有以下內容:

  <ItemGroup>
    <Content Include="ApiClientSettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>
  </ItemGroup>

根據MS 文檔PackageCopyToOutput屬性應該完全符合我的要求,但是當我將 package 安裝到 .NET 框架項目中時,它似乎不起作用。 (完美適用於 .NET 核心項目)

我還缺少什么嗎?

這是我的整個.csproj 文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <IsPackable>true</IsPackable>
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
    <AllowedOutputExtensionsInPackageBuildOutputFolder>
      $(AllowedOutputExtensionsInPackageBuildOutputFolder);.json
    </AllowedOutputExtensionsInPackageBuildOutputFolder>
    <Version>1.0.0</Version>
    <AssemblyVersion>1.0.0.0</AssemblyVersion>
    <FileVersion>1.0.0.0</FileVersion>
    <IncludeContentInPack>true</IncludeContentInPack>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <OutputPath></OutputPath>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="ApiClientSettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.7" />
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.5" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.5" />
    <PackageReference Include="Microsoft.Extensions.Http" Version="3.1.5" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\DbModelLibrary\DbModelLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>DbModelLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths-&gt;WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
    </ItemGroup>
  </Target>

</Project>

這也是我的 generated.nuspec 文件:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>Iso17025ApiClient</id>
    <version>1.0.0</version>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <dependencies>
      <group targetFramework=".NETStandard2.0">
        <dependency id="Microsoft.AspNet.WebApi.Client" version="5.2.7" exclude="Build,Analyzers" />
        <dependency id="Microsoft.Extensions.Configuration" version="3.1.5" exclude="Build,Analyzers" />
        <dependency id="Microsoft.Extensions.Configuration.Json" version="3.1.5" exclude="Build,Analyzers" />
        <dependency id="Microsoft.Extensions.Http" version="3.1.5" exclude="Build,Analyzers" />
        <dependency id="Newtonsoft.Json" version="12.0.3" exclude="Build,Analyzers" />
      </group>
    </dependencies>
    <contentFiles>
      <files include="any/netstandard2.0/appsettings.json" buildAction="Content" copyToOutput="true" />
    </contentFiles>
  </metadata>
</package>

我正在添加消費 .NET 框架應用程序的文件結構:

在此處輸入圖像描述

When the NuGet package reference is used, the file gets copied to the output directory, from the global package directory, but does not get added to the solution.

如果使用 packages.config,文件將被復制到解決方案,但不會標記為“復制到輸出”,即使在 NuGet package 中指定這樣做也是如此。

這可能與 pacakges.config 和 PackageReference NuGet package 管理之間的更改有關? contentFiles 和 content 之間的區別可能。

仍然讓我感到困惑的是,.NET 核心應用程序使用 PackageReference,其行為與 .NET 框架應用程序不同。 在 .NET 核心應用程序中,將 appsettings.json 添加到解決方案並標記為“復制到輸出”。

我希望用戶對 package 有大致相同的體驗,無論他們使用哪種目標框架。 (我不希望他們手動添加 appsettings.json 只是因為他們使用的是 .NET 框架。這在某種程度上可以避免嗎?

我已經在簡單的項目中使用您的示例中的這些行進行了嘗試,並且可以正常工作。

<ItemGroup>
    <Content Include="ApiClientSettings.json">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        <PackageCopyToOutput>true</PackageCopyToOutput>
        <PackagePath>contentFiles\any\any\;content</PackagePath>
    </Content>
</ItemGroup>

但是,您生成的 NuSpec 有問題。 contentFiles標記中的這一行是錯誤的。

<files include="any/netstandard2.0/ApiClientSettings.json" buildAction="Content" copyToOutput="Always" />

根據您的項目文件,它應該是any而不是netstandard2.0 ,並且copyToOutput的屬性允許truefalse ,但不是Always 文件標簽應如下所示。

<files include="any/any/ApiClientSettings.json" buildAction="Content" copyToOutput="true" />

也許測試您的 package 有剩余,並且您的緩存已損壞,因為您的 NuSpec 與給定的項目文件不匹配。 在 Visual Studio 中,您可以使用工具 > 選項 > NuGet Package 管理器 > 常規 > 清除所有緩存或刪除全局.nuget文件夾內容來清除緩存。

僅供您比較,這是圖書館項目。

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    </PropertyGroup>
    <ItemGroup>
        <None Remove="ApiClientSettings.json" />
    </ItemGroup>
    <ItemGroup>
        <Content Include="ApiClientSettings.json">
            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
            <PackageCopyToOutput>true</PackageCopyToOutput>
            <PackagePath>contentFiles\any\any\;content</PackagePath>
        </Content>
    </ItemGroup>
</Project>

這是 .NET 框架和 .NET 核心項目中的PackageReference

<ItemGroup>
    <PackageReference Include="ClassLibrary" Version="1.0.0" />
</ItemGroup>

您在PackageReferencepackages.config之間識別的行為是因為后者不支持contentFiles 您將不得不求助於使用content文件夾和自定義 MS Build .targets文件, 如下所示

我希望用戶對 package 有大致相同的體驗,無論他們使用哪種目標框架。

NuGet 包的行為非常不同,不僅在PackageReferencepackages.config方面,而且在您的庫和應用程序中使用舊式項目格式還是新 SDK 式項目格式。 因此,很難在所有情況下都提供相同的體驗。 我建議您使用帶有PackageReference的 SDK 風格的項目來訪問最新的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM