如何在NuGet包中包含.lic文件并设置CopyToOutputDirectory属性
如何将NuGet包中的.lic文件复制到消费项目根目录并设置CopyToOutputDirectory为PreserveNewest
我的NuGet包包含三个.NET程序集和一个.lic许可证文件,需求是安装包时将许可证文件复制到消费项目的根目录,同时把它的CopyToOutputDirectory属性设置为PreserveNewest。目前程序集能正常复制,但许可证文件始终无法生效——我试过把它放在包的lib和content文件夹,也尝试过多种配置方案,都没解决问题。
附上项目文件内容:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Library</OutputType> <RootNamespace></RootNamespace> <TargetFramework>netstandard2.0</TargetFramework> <AppDesignerFolder>Properties</AppDesignerFolder> <Version>1.0.5</Version> <GeneratePackageOnBuild>True</GeneratePackageOnBuild> </PropertyGroup> <ItemGroup> <Folder Include="Properties\" /> </ItemGroup> <ItemGroup> <Reference Include="HexDns.NET"> <HintPath>Hexillion\HexDns.NET.dll</HintPath> </Reference> <Reference Include="HexNetwork.NET"> <HintPath>Hexillion\HexNetwork.NET.dll</HintPath> </Reference> <Reference Include="HexValidEmail.NET"> <HintPath>Hexillion\HexValidEmail.NET.dll</HintPath> </Reference> </ItemGroup> <ItemGroup> <None Include="Hexillion\HexDns.NET.dll"> <Pack>true</Pack> <PackagePath>lib\netstandard2.0\HexDns.NET.dll</PackagePath> </None> <None Include="Hexillion\HexNetwork.NET.dll"> <Pack>true</Pack> <PackagePath>lib\netstandard2.0\HexNetwork.NET.dll</PackagePath> </None> <None Include="Hexillion\HexValidEmail.NET.dll"> <Pack>true</Pack> <PackagePath>lib\netstandard2.0\HexValidEmail.NET.dll</PackagePath> </None> <None Include="HexValidEmail.NET.lic"> <Pack>true</Pack> <PackagePath>lib\HexValidEmail.NET.lic</PackagePath> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> </Project>
编辑进展:
通过调整配置,已经能把.lic文件复制到消费项目根目录,但CopyToOutputDirectory属性还是没设置成功,当前配置如下:
<ItemGroup> <Content Include="contentFiles/**/*.*"> <Pack>true</Pack> <PackagePath>contentFiles\any\any;content</PackagePath> <IncludeInPackage>true</IncludeInPackage> <CopyToOutput>true</CopyToOutput> <BuildAction>Content</BuildAction> <CopyToOutput>true</CopyToOutput> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> </Content> </ItemGroup>
解决方案
要同时实现复制到消费项目根目录和设置CopyToOutputDirectory为PreserveNewest,需要用NuGet的contentFiles机制配合正确的MSBuild元数据,具体步骤如下:
调整文件结构
在类库项目根目录下创建contentFiles\any\any文件夹,将.lic文件放入该路径。修改项目文件配置
替换原有的.lic文件相关配置,使用如下ItemGroup(程序集配置保持不变):
<ItemGroup> <!-- 程序集配置保留 --> <None Include="Hexillion\HexDns.NET.dll"> <Pack>true</Pack> <PackagePath>lib\netstandard2.0\HexDns.NET.dll</PackagePath> </None> <None Include="Hexillion\HexNetwork.NET.dll"> <Pack>true</Pack> <PackagePath>lib\netstandard2.0\HexNetwork.NET.dll</PackagePath> </None> <None Include="Hexillion\HexValidEmail.NET.dll"> <Pack>true</Pack> <PackagePath>lib\netstandard2.0\HexValidEmail.NET.dll</PackagePath> </None> <!-- .lic文件核心配置 --> <Content Include="contentFiles\any\any\HexValidEmail.NET.lic"> <Pack>true</Pack> <PackagePath>contentFiles\any\any\HexValidEmail.NET.lic</PackagePath> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> <Visible>true</Visible> </Content> </ItemGroup>
- 关键说明
contentFiles\any\any是NuGet通用路径,适配所有目标框架和项目类型;<Visible>true</Visible>确保文件在消费项目的解决方案资源管理器中可见,同时会自动继承CopyToOutputDirectory配置;- 避免同时混用
content和contentFiles路径,contentFiles是NuGet 3.3+推荐的方式,能更精准控制文件在消费项目中的属性。
- 验证步骤
- 重新生成NuGet包;
- 在消费项目中安装更新后的包;
- 查看项目根目录是否出现
.lic文件,右键查看属性,确认复制到输出目录已设置为较新的则复制(对应PreserveNewest)。
内容的提问来源于stack exchange,提问作者InteXX
相关产品推荐
相关产品推荐

