自定义NuGet包中NLog.config未在最终构建中显示的问题求助
解决NuGet包中NLog.config未出现在构建产物的问题
我之前也碰到过一模一样的情况——用通配符打包所有文件,结果其他文件都正常,唯独NLog.config死活出现在引用项目的构建输出里。核心问题其实是NuGet默认不会给通配符包含的文件设置copyToOutput属性,哪怕你能在NuGet包的内容里看到这个文件,它也不会自动被复制到最终构建产物中。
这里给你两个靠谱的解决方案:
方案1:在nuspec文件中显式指定NLog.config的复制行为
虽然你觉得单独加文件节点是冗余操作,但这其实是必要的——通配符包含的文件默认copyToOutput为false,单独声明可以覆盖这个默认值。修改你的nuspec文件:
<files> <!-- 保留你原来的通配符包含,确保其他文件正常打包 --> <file src="*.*" target="content" /> <!-- 单独指定NLog.config,强制设置复制到输出 --> <file src="NLog.config" target="content" copyToOutput="true" /> </files>
重新打包后,引用这个NuGet包的项目就会自动把NLog.config复制到构建输出目录了。
方案2:在类库项目的.csproj中配置文件属性
如果不想修改nuspec,也可以直接在你的NuGet类库项目里设置NLog.config的属性,让打包时自动带上复制规则。打开类库的.csproj文件,添加以下配置:
<ItemGroup> <Content Include="NLog.config"> <!-- 确保文件复制到输出目录,保留最新版本 --> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <!-- 告诉NuGet打包时带上这个复制属性 --> <PackageCopyToOutput>true</PackageCopyToOutput> </Content> </ItemGroup>
重新打包NuGet包后,引用它的项目就会自动继承这个复制规则,NLog.config就能正常出现在构建产物里了。
额外说明
为什么通配符*.*没起作用?因为NuGet在处理通配符包含的文件时,不会自动读取源文件的复制属性,也不会默认设置copyToOutput为true——只有显式声明的文件,或者在项目里提前配置了属性的文件,才会带上复制到输出的规则。
内容的提问来源于stack exchange,提问作者E.Boyle
相关产品推荐
相关产品推荐

