簡體   English   中英

為什么 NuGet 包中的內容文件作為鏈接添加到 .NET 核心項目中,您如何防止這種情況發生?

[英]Why are content files from NuGet packages added as links in .NET Core projects and how can you prevent that?

我正在開發一個 .NET 標准庫,並計划在 .NET 核心和 .NET 框架項目中使用它。 我的庫依賴於第三個庫,該庫本身依賴於一些 C 二進制文件。 必須將 C 二進制文件復制到將引用我的庫的項目的 output 目錄中。

我將二進制文件作為內容添加到我的庫項目中,當 NuGet package 使用dotnet pack命令打包時,它們被復制到contentcontentFiles目錄。 這些文件也列在nuspec文件中。


但是,當我安裝 NuGet package 時,有兩種不同的行為需要觀察,具體取決於我將它安裝到 .NET 框架還是 Z3031CB0EF9EDB59072DAZ6 核心項目:5EF9EDB9078282

.NET 框架

我添加到庫項目中的二進制文件也添加到了引用項目中,我可以將它們復制到 output 目錄中。 這是我期望、想要並且有效的行為。

.NET芯

我添加到我的庫項目中的二進制文件也添加到了引用項目中,但作為鏈接也可以使用,但當然只能在我的機器上使用,因為 NuGet 包默認存儲在 Windows 用戶文件夾中。 這會給將在不同機器上處理同一項目的其他任何人帶來問題,因為在這種情況下,文件的鏈接會被破壞。


我已經嘗試過處理nuspec文件本身,但這並沒有真正的幫助,因為我只在 CI 管道完成打包后獲得了nuspec文件。

為什么在這種情況下 .NET 框架和 .NET 核心項目的行為不同,是否可以獲得 .NET 框架項目在 Z303CB0EF59EDB9072DAZ6 核心項目中的行為?

實際上,這是正常的行為。

你看到的 content 和 contentFiles 的行為是正常的,它們的規則是由微軟設計的。

請參考這個類似的問題這個

內容節點會將其內容作為真實文件打包到主項目中。 這適用於具有packages.config nuget 管理格式的 Net Framework 項目。

同時, ContentFiles節點會將其內容以鏈接格式打包到主項目( Net CoreNet Standard項目)中。 這是PackageReference nuget 管理格式。

因此,如果您希望此功能與Net Core上的Net Framework項目相同,則應在網絡標准項目上使用<package_id>.props來獲得您想要的。

腳步

1)在您的網絡標准庫項目的build文件夾下創建一個名為<packages_id>.props的文件。

在此處輸入圖像描述

注意:如果您的庫 nuget 被稱為lib.1.0.0.nupkg ,則道具文件應命名為lib.props文件,以便它可以工作。 它應該與nuget_id相同。

2)將這些添加到lib.props文件中:

<Project>
  <Target Name="CopyFiles" BeforeTargets="Build">
    <ItemGroup>     
      <File Include="$(MSBuildThisFileDirectory)..\Binary\*.*"></File>          
    </ItemGroup>
      <Copy SourceFiles="@(File)" DestinationFolder="$(ProjectDir)Binary"></Copy>
  </Target>
</Project>

3)將這些添加到 lib 項目的xxx.csproj文件中。

<ItemGroup>
<None Include="xxx\**.**"(all the binary files) Pack="true" PackagePath="Binary"></None>
<None Include="build\lib.props" Pack="true" PackagePath="build"></None>
</ItemGroup>

4)當您安裝此新版本的 nuget package 時,它將二進制文件復制到名為Binary的文件夾中到您的主項目中。

Also, when you install this new version of nuget package, please clean your nuget caches or delete all files under C:\Users\xxx(current user)\.nuget\packages .

此外關於步驟也有類似的問題

根據Perry Quan-MSFT回答,我將二進制文件復制到 output 目錄而不是項目中。

我認為這比用不必要的文件弄亂一個項目更好。

這是我的props文件的樣子:

<Project ToolsVersion="4.0" xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
  <ItemGroup>
    <Binaries Include="$(MSBuildThisFileDirectory)..\binaries\*.*" />
  </ItemGroup>

  <Target Name="CopyBinaries" BeforeTargets="Build">
    <Copy SourceFiles="@(Binaries)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
  </Target>
</Project>

Success that I'd like to share - Am using dotnetcore (.Net 6) I needed to share a c# class library as well as common json config files and created a library class project that includes content files and outputs a nuget package.

采用其他好的答案 - 這是在合並其他建議后對我有用的方法。

在“lib”項目中 - 包括 build\lib.props 文件。 內容:

<Project>
    <Target Name="CopyFiles" BeforeTargets="Build">
        <ItemGroup>
            <ConfigFilesShared Include="$(MSBuildThisFileDirectory)..\SharedConfig\*.*" />
        </ItemGroup>
        <Copy SourceFiles="@(ConfigFilesShared)" DestinationFolder="$(ProjectDir)SharedConfig" SkipUnchangedFiles="false"></Copy>
    </Target>
</Project>

以上在構建之前將文件復制到使用項目的文件夾中。

在 lib.csproj 文件中還包括以下內容:

<ItemGroup>
    <Content Include="Config\*" Pack="true" PackagePath="SharedConfig\" />
    <None Include="Build\Roc.Shared.props" Pack="true" PackagePath="build"></None>
</ItemGroup>

在“消費”項目中 - 為了隱藏項目中的文件目錄以免混淆,我的 csproj 中有以下內容正在使用共享庫:

<ItemGroup>
    <Content Remove="SharedConfig\**" />
    <None Remove="SharedConfig\**" />
</ItemGroup>

為確保文件包含在 Output(常規構建)和發布中,使用以下代碼。

<!-- For Build - Move the shared library shared config files that were previously copied to the SharedConfig folder-->
<Target Name="PrebuildScriptShared" BeforeTargets="Build">
    <ItemGroup>
        <ConfigFiles1 Include="SharedConfig\**" />
    </ItemGroup>
    <Copy SourceFiles="@(ConfigFiles1)" DestinationFolder="$(OutDir)Config" SkipUnchangedFiles="false" />
</Target>
<!-- For Publish - Move the shared library shared config files that were previously copied to the SharedConfig folder-->
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
    <ItemGroup>
        <ConfigFiles2 Include="SharedConfig\**" />
    </ItemGroup>
    <Copy SourceFiles="@(ConfigFiles2)" DestinationFolder="$(PublishDir)Config" SkipUnchangedFiles="false" />
</Target>

,您現在擁有從 nuget package 復制到您的消費項目的內容文件,並在構建期間使用。 調試和發布::)

暫無
暫無

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

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