![](/img/trans.png)
[英]Is there framework-dependent deploy of .net core app with added nuget packages?
[英]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
命令打包時,它們被復制到content
和contentFiles
目錄。 這些文件也列在nuspec
文件中。
但是,當我安裝 NuGet package 時,有兩種不同的行為需要觀察,具體取決於我將它安裝到 .NET 框架還是 Z3031CB0EF9EDB59072DAZ6 核心項目:5EF9EDB9078282
我添加到庫項目中的二進制文件也添加到了引用項目中,我可以將它們復制到 output 目錄中。 這是我期望、想要並且有效的行為。
我添加到我的庫項目中的二進制文件也添加到了引用項目中,但作為鏈接也可以使用,但當然只能在我的機器上使用,因為 NuGet 包默認存儲在 Windows 用戶文件夾中。 這會給將在不同機器上處理同一項目的其他任何人帶來問題,因為在這種情況下,文件的鏈接會被破壞。
我已經嘗試過處理nuspec
文件本身,但這並沒有真正的幫助,因為我只在 CI 管道完成打包后獲得了nuspec
文件。
為什么在這種情況下 .NET 框架和 .NET 核心項目的行為不同,是否可以獲得 .NET 框架項目在 Z303CB0EF59EDB9072DAZ6 核心項目中的行為?
實際上,這是正常的行為。
你看到的 content 和 contentFiles 的行為是正常的,它們的規則是由微軟設計的。
內容節點會將其內容作為真實文件打包到主項目中。 這適用於具有packages.config nuget 管理格式的 Net Framework 項目。
同時, ContentFiles節點會將其內容以鏈接格式打包到主項目( Net Core和Net 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.