上次我不得不找出如何从Nuget包中提取文件的过程,这花了我至少6个月的时间,但最终我找到了the solution。
问题是,此解决方案假定我有一个.nupkg
文件并手动添加一个.targets
文件以执行提取过程。
现在,情况有所不同:
.nupgk
文件,我们使用dotnet pack
命令在VSTS服务器上自动生成了一个文件。然后我们从Nuget服务器中使用该软件包这是我的ProjectName.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<Authors>Jérôme MEVEL</Authors>
<Version>1.0.3</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<!-- This answer got many votes on a Github thread so I tried just in case -->
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<!-- Just trying that too-->
<IncludeBuildOutput>true</IncludeBuildOutput>
<IncludeContentInPack>true</IncludeContentInPack>
<!-- I wanted to see the full generated Nuget package -->
<IncludeSource>true</IncludeSource>
<!-- desperate attempt -->
<TargetsForTfmSpecificBuildOutput>GetMyPackageFiles</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="1.50.5" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.1.1" />
<PackageReference Include="NLog" Version="4.5.8">
<!-- Let's try this too just in case-->
<IncludeAssets>all</IncludeAssets>
</PackageReference>
<PackageReference Include="NLog.Extensions.Logging" Version="1.2.1">
<IncludeAssets>all</IncludeAssets>
</PackageReference>
<PackageReference Include="NLog.Web.AspNetCore" Version="4.6.0">
<IncludeAssets>all</IncludeAssets>
</PackageReference>
<PackageReference Include="System.Data.Common" Version="4.3.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.5.1" />
</ItemGroup>
<ItemGroup>
<!-- Added the file to the root folder in case <IncludeAssets>all</IncludeAssets> is looking there -->
<Content Include="NLog.config">
<Pack>true</Pack>
<PackagePath>NLog;;</PackagePath>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<!-- My desired path to look for the file -->
<Content Include="NLog\NLog.config">
<Pack>true</Pack>
<PackagePath>NLog;;</PackagePath>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<!-- This is the default setting, perfectly working when I reference the project instead of installing the Nuget package -->
<ItemGroup>
<None Update="NLog\NLog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<!-- desperate attempt -->
<Target Name="GetMyPackageFiles">
<ItemGroup>
<BuildOutputInPackage Include="NLog/Nlog.config">
<TargetPath>NLog</TargetPath>
</BuildOutputInPackage>
</ItemGroup>
</Target>
</Project>
您可以看到我尝试了几种不同的设置。此MsBuild会产生一个NLog.config
文件,该文件包含在Nuget软件包文件根目录的NLog
文件夹中。
在进行不同的尝试期间,根据我设置的配置,我最终可以在NLog.config
甚至甚至是src/ProjectName.Logging/NLog/NLog.config
处找到lib/netstandard2.0/Nlog.config
文件。
因此,我的文件肯定包含在我的Nuget软件包文件中,但不会复制到使用该软件包的项目的输出目录中。
使用described here之类的.nuspec
生成程序包时,我试图指定一个dotnet pack
文件,但是我始终无法获得理想的结果(只有我的NLog.config
包含在Nuget包或所有源文件中)。此外,这有一些缺点,例如覆盖.csproj
文件中的配置或增加无用的复杂性。我相信无需使用.nuspec
文件就可以实现我想实现的目标(也许我错了)。
我注意到我的软件包中缺少build/ProjectName.targets
文件,这很可能是缺少的文件。那么如何在不手动修改程序包的情况下添加此.targets
文件呢?
还有另一种方法可以将我的配置文件从Nuget包复制到输出目录吗?
我真的希望有人可以帮助我解决这个问题。这是我第二次要执行相同的操作,但略有不同,这又很难做到。
非常感谢
答案 0 :(得分:2)
好吧,我终于找到了解决方案,其中包括一个.nuspec
文件和一个.targets
文件。
ProjectName.csproj
仅需要包含此内容
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<NuspecFile>ProjectName.Logging.nuspec</NuspecFile>
</PropertyGroup>
<!-- This is just for some projects referencing this project directly instead of the Nuget package -->
<ItemGroup>
<Content Include="NLog\NLog.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="1.50.5" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.1.1" />
<PackageReference Include="NLog" Version="4.5.8" />
<PackageReference Include="NLog.Extensions.Logging" Version="1.2.1" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.6.0" />
<PackageReference Include="System.Data.Common" Version="4.3.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.5.1" />
</ItemGroup>
</Project>
在ProjectName.nuspec
中,您放置了与Nuget软件包相关的所有内容
<?xml version="1.0"?>
<package >
<metadata>
<id>ProjectName.Logging</id>
<version>1.1.0</version>
<authors>Jérôme MEVEL</authors>
<description>Just a logging component</description>
<releaseNotes>Extract the NLog.config file automatically</releaseNotes>
<dependencies>
<dependency id="Dapper" version="1.50.5" />
<dependency id="Microsoft.Extensions.DependencyInjection" version="2.1.1" />
<dependency id="Microsoft.Extensions.Logging" version="2.1.1" />
<dependency id="Microsoft.Extensions.Logging.Abstractions" version="2.1.1" />
<dependency id="NLog" version="4.5.8" />
<dependency id="NLog.Extensions.Logging" version="1.2.1" />
<dependency id="NLog.Web.AspNetCore" version="4.6.0" />
<dependency id="System.Data.Common" version="4.3.0" />
<dependency id="System.Data.SqlClient" version="4.5.1" />
</dependencies>
</metadata>
<files>
<file src="bin\Release\netstandard2.0\ProjectName.Logging.dll" target="lib/netstandard2.0/ProjectName.Logging.dll" />
<file src="ProjectName.Logging.targets" target="build/ProjectName.Logging.targets" />
<file src="NLog/Nlog.config" target="content/Nlog.config" />
</files>
</package>
最后是ProjectName.targets
。 小心!该文件位于计算机的Nuget缓存中。您将可以在Visual Studio中项目的根目录中看到它,而在Windows资源管理器中(至少在Windows中)不能看到它。因此,如果您在Visual Studio中修改文件,它将为该计算机上引用相同Nuget包(和相同版本)的所有其他项目修改文件。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Content Include="$(MSBuildThisFileDirectory)\..\content/NLog.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
我使用 dotnet pack
nuget pack
命令生成Nuget包(现在,我已经积累了更多经验,我知道dotnet pack
并不与.nuspec
文件配合使用时,有几个错误)
结果如下:
最后,我只能安装我的软件包,并且在构建过程中,Nlog.config
文件将从Nuget缓存中复制到项目的输出目录中。
答案 1 :(得分:2)
如果您按照here的描述从.nuspec
文件创建nuget,则可以复制不包含.csproj
文件的文件。
要将文件从nuget复制到输出目录,请创建一个具有以下内容的ProjectName.targets
文件:
<ItemGroup>
<LogFiles Include="$(MSBuildThisFileDirectory)\..\contentFiles\LogFiles\*.config" />
</ItemGroup>
<Target Name="CopyLogFiles" BeforeTargets="Build">
<Copy SourceFiles="@(LogFiles)" DestinationFolder="$(TargetDir)CopiedLogFiles\" />
</Target>
在您的.csproj
文件中添加:
<ItemGroup Label="FilesToCopy">
<Content Include="ProjectName.targets" PackagePath="build/ProjectName.targets" />
<Content Include="LogFiles\*.config" Pack="true" PackagePath="contentFiles\LogFiles">
<PackageCopyToOutput>true</PackageCopyToOutput>
</Content>
</ItemGroup>
路径和名称当然可以自由选择。
这应该将所有.config
文件复制到输出目录中名为CopiedLogFiles
的文件夹中!
答案 2 :(得分:0)
我认为How do you set nuget contentFiles CopyToOutput value to true when using a .Net Standard library .csproj?为这个问题提供了更好的答案。 https://github.com/NuGet/NuGet.Client/pull/1450
您可以在.csproj中将PackageCopyToOutput
设置为true,以将nuget内容文件声明为“ CopyToOutput = true”。这样,任何引用nuget的项目都将在引用的csproj文件中将内容文件标记为<CopyToOutput>true</CopyToOutput>
,指示msbuild将内容文件复制到输出目录:
在nuget项目的.csproj中:
<Content Include="...">
<PackageCopyToOutput>true</PackageCopyToOutput>
</Content>