【问题标题】:App.config XML transform from NuGet Package来自 NuGet 包的 App.config XML 转换
【发布时间】:2018-04-05 19:35:28
【问题描述】:

我正在尝试关注these instructions,通过自定义 NuGet 包对目标 App.config 文件执行简单的 XML 转换。

app.config.transform 文件包含以下内容:

<configuration>
  <appSetttings>
    <add key="foo" value="bar" />
  </appSetttings>
</configuration>

.nuspec 文件包含以下内容:

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>Foo.Bar</id>
    <version>1.0.0</version>
    <title>Foo Bar</title>
    <authors>Foo</authors>
    <description>Bar</description>
  </metadata>
  <files>
    <file src="app.config.transform" target="content" />
  </files>
</package>

这会在运行nuget pack 时将文件正确插入到.nupkg 文件中的content 文件夹中。

在 Visual Studio 2017 (15.6.4) 中,将 NuGet 包添加到具有现有 vanilla App.config 文件的全新控制台应用程序时,不会发生任何转换(即App.config 的内容未更改)。 XDT 变换也是如此。

谁能告诉我为什么转型失败了?

更新

我在目标 .NET Framework 4.7.1 项目中使用 PackageReference 作为我的包管理格式。

【问题讨论】:

标签: visual-studio nuget nuspec


【解决方案1】:

在 Visual Studio 2017 (15.6.4) 中,将 NuGet 包添加到具有现有 vanilla App.config 文件的全新控制台应用程序时,不会发生任何转换。

你是什么意思“没有发生转换”? appSetttings 部分下的新元素和属性未合并到 App.config 中?

我已经使用您的 .nuspecapp.config.transform 文件创建了 nuget 包:

nuget 包:https://1drv.ms/u/s!Ai1sp_yvodHf1QFNsI3ybdw2nanD

然后将其设置为我的本地提要,创建一个新的.net控制台应用程序并将该nuget包添加到测试项目中,您会发现appSetttings部分下的新元素和属性合并到App.config中,所以App.config在安装那个nuget包后会是这样的:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1" />
    </startup>

   <appSetttings>
    <add key="foo" value="bar" />
   </appSetttings>

</configuration>

所以它应该可以正常工作。一种可能是你安装这个包的时候没有清理缓存,为了确认,请删除解决方案文件夹下的包文件夹。

注意:

请注意,NuGet 并未替换 startup 部分,它只是通过仅添加新元素和属性将新条目合并到其中。 NuGet 不会更改任何现有元素或属性。

更新:

当执行与您完全相同的步骤时,这对我不起作用,但我使用的是 PackageReference 而不是 packages.config。这是 PackageReference 的错误吗?

不,这不是PackageReference 的错误。根据 doc Transforming source code and configuration files,前两行:

对于使用 packages.config 的项目,NuGet 支持在包安装和卸载时对源代码和配置文件进行转换。使用 PackageReference 在项目中安装包时,仅应用源代码转换。

我们可以知道 packages.config 支持对源代码和配置文件进行转换的能力,但是只有源代码转换应用于PackageReference .这就是为什么您无法使用 PackageReference 完成这项工作的原因。

【讨论】:

  • 在执行与您完全相同的步骤时,这对我不起作用,但我使用的是 PackageReference 而不是 packages.config。当切换回packages.config 时,这确实像它为您所做的那样工作。这是PackageReference 的错误吗?
  • @WolfyUK,不,这不是PackageReference 的错误。那是因为PackageReference只应用了源代码转换,它目前不支持转换配置文件。详情请查看我更新的答案。
  • 谢谢。我找到了一种使用NuGet Samples 上的 MSBuild 目标实现PackageReference 转换的示例方法
猜你喜欢
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2015-12-05
  • 2017-06-07
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多