0

我刚刚创建了一个自定义 nuget 包,目的是打包我们的 Devart dll,我们在所有项目中都有适当的版本控制和更新机制。

Nuget 包的结构是根据官方 wiki上的说明进行的,如下所示:

  • 德瓦特甲骨文
    • 内容
      • web.config.transform
      • Devart.Data.Oracle.dll
      • ...
    • DevartOracle.nuspec

nuspec 文件的内容大致如下:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>DevartOracle</id>
    <version>6.70.311-pre6</version>
    <title>Devart Oracle dotConnect</title>
    ...
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Drivers from Devart for Oracle and Entity Framework</description>
    <releaseNotes></releaseNotes>
    <copyright>Copyright 2012</copyright>
    <tags></tags>
    <dependencies>
    </dependencies>
  </metadata>
</package>

其实没什么特别的。我使用以下命令将 nuget 包发布到我们的本地存储库:

nuget pack DevartOracle.nuspec

dll 的安装很好,但是我也想创建一个 web.config 合并。因此,我添加了文档中指定的 web.config.transform 文件......再次包含以下内容:

 <?xml version="1.0" encoding="utf-8"?>
  <configuration>
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Devart.Data.Oracle" publicKeyToken="09af7300eec23701" culture="neutral" />
          <bindingRedirect oldVersion="0.0.0.0-6.70.311.0" newVersion="6.70.311.0" />
        </dependentAssembly>
      </assemblyBinding>
    </runtime>
    <system.data>
      <DbProviderFactories>
        <remove invariant="Devart.Data.Oracle" />
        <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle, Version=6.70.311.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
      </DbProviderFactories>
    </system.data>
  </configuration>

问题

当我执行合并到一个不存在或空<assemblyBinding>部分的 web.config 时,一切都按预期工作,但是当我有 - 比如说 - 已经存在以下内容时:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

那么合并的结果就是这个奇怪的结果:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
      <assemblyIdentity name="Devart.Data.Oracle" publicKeyToken="09af7300eec23701" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-6.70.311.0" newVersion="6.70.311.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

有任何想法吗??


更新:

一位 Microsoft 员工和活跃的 NuGet 开发人员在 Twitter 上发布了一个更新,可能值得在这里分享信息: https ://twitter.com/dotnetjunky/status/266533404143656960

4

1 回答 1

2

按照设计,NuGet 仅允许将更改附加到现有 XML 文件(合并适用于任何 XML 类型的文件,无论扩展名如何,只要您要合并的文件使用 {filename}.{extension} 的约定命名。转换)。

这是因为 NuGet 还需要能够卸载包安装所做的更改(除非您在安装后手动对更改的文件进行了修改,在这种情况下,NuGet 将在卸载时保持不变)。

这与您对XML Config Transforms的期望非常不同,这可能会导致这里的混乱。

如果您想对目标文件进行真正的转换,则必须使用 PowerShell 路线,并通过在包的工具文件夹中编写 install.ps1 和 uninstall.ps1 文件的脚本来实现。

于 2012-11-07T21:04:27.787 回答