【问题标题】:Application doesn't include NLog.config from my NuGet package应用程序不包括我的 NuGet 包中的 NLog.config
【发布时间】:2018-03-15 02:08:27
【问题描述】:

我正在为我的团队设置一个 NuGet 包,以便在内部用于我们所有的项目。它包含用于为引用该包的任何项目配置 NLog 记录器的代码。但是,我们的自定义 NLog.config 文件没有显示在最终构建中,但 NuGet 包中包含的所有其他文件都在那里。

这是我的 nuspec 文件:

<?xml version="1.0"?>
    <package >
      <metadata>
        ...
      </metadata>
      <files>
        <file src="bin\Release\*.*" target="lib\net45" />    
      </files>
    </package>

我尝试将它添加到文件中,但它是多余的,并且没有任何改变:

<file src="bin\Release\NLog.config" target="lib\net45" />

由于我们包含了所有带有 *.* 的文件,它们都显示在 lib/net45 文件夹中的 .nupkg 文件中。所有 .dll、.xmls 和 .configs 都在 nupkg 中,包括 NLog.config。所以我需要的文件可以很好地放入包中。

当我将此 NuGet 包包含在项目中并查看构建输出时,就会出现问题。应用程序的构建输出包含我需要的 nupkg 中的所有内容,但 NLog.config 除外。甚至包括 Utilities.dll.config。

是否需要在 nuspec 文件中指定一些内容?还是在 Visual Studio 项目中如 MSBuild 设置?如何确保将 NuGet 包中包含的所有文件复制到应用程序的构建输出?

【问题讨论】:

    标签: c# .net msbuild nuget nlog


    【解决方案1】:

    我能够根据 Adam Catamak 的建议解决此问题,并查看 nupkg 中的 NLog 自己的配置包,看看他们是如何做到的。

    对我有用的 nuspec 文件如下所示:

    <?xml version="1.0"?>
    <package >
      <metadata>
        ...
      </metadata>
      <files>
        <file src="bin\Release\*.*" target="lib\net45" />
        <file src="bin\Release\NLog.config" target="content"/>
        <file src="Install.ps1" target="tools"/>
      </files>
    </package>
    

    如果您不使用 Install.ps1,则每次更新软件包时,用户都必须手动将其更新为“始终复制”。这是 NLog 使用的 Install.ps1:

    param($installPath, $toolsPath, $package, $project)
    
    $configItem = $project.ProjectItems.Item("NLog.config")
    
    # set 'Copy To Output Directory' to 'Copy if newer'
    $copyToOutput = $configItem.Properties.Item("CopyToOutputDirectory")
    $copyToOutput.Value = 1
    
    # set 'Build Action' to 'Content'
    $buildAction = $configItem.Properties.Item("BuildAction")
    $buildAction.Value = 2
    

    【讨论】:

      【解决方案2】:

      您检查 nlog.config 文件属性吗?

      如果文件属性 - “复制到输出目录”是“不复制”,因此您无法在 Release 文件夹中看到配置文件。

      另外,如果要将 NLog.config 文件下载到主目录,target 必须是 emtpy。

      就我而言,我在 nuspec 文件中使用了以下行: &lt;file src="bin\Release\content\log4net.config" target=""&gt;&lt;/file&gt;

      【讨论】:

      • 配置文件 正在 被复制到 NuGet 包中就好了。问题是当应用程序使用 NuGet 包时,他们没有得到文件的副本。
      • 你能试试把这行加入到.nupec文件&lt;file src="bin\Release\NLog.config" target="" /&gt;
      • 这会将配置文件放在 nupkg 文件的根级别,但在应用程序安装包时它仍然不包含在内。我还尝试使用构建目标文件: PreserveNewest 它没有帮助
      • 如果你的项目是开源的,可以发链接供审阅吗?如果它不是开源的,可能你想检查这个链接(github.com/AdemCatamak/RapidLogger/tree/master/…)。我希望你能找到解决方案?祝你好运
      • 我查看了那个链接,当我设置 target="content" 时终于让它工作了。然后它出现在项目中,然后在项目文件中手动将其设置为“始终复制”。期望开发人员每次更新我的 NuGet 包时手动设置它有点乏味,但目前这是一个可行的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2019-10-11
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多