[英]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.