2

我有一个在项目上应用 app.config 转换的包。转换文件看起来像这样

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="handlerId" value="$assemblyname$"/> <!--populate from project params-->
    <--other params-->
  </appSettings>
</configuration>

案例是:将包添加到没有app.config的新项目中,手动更新项目中的app.config,然后更新包。

如果我将 app.config.transform 包含到我的包中,nuget 会在项目中创建 app.config,但是如果我更改参数之一的值并更新/重新安装包,它会使用包的值创建该参数的副本,而不是跳过它。

例如:在干净的项目上安装的包

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="handlerId" value="MyApp"/>
  </appSettings>
</configuration>

然后将 handlerId 值更改为MyApp1并更新包。变换的结果是

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="handlerId" value="MyApp1"/>
    <add key="handlerId" value="MyApp"/> <!--shouldn't appear!-->
  </appSettings>
</configuration>

我尝试改用 xdt 转换。它们在使用 app.config 更新包或在项目上安装包时效果很好,但如果没有 app.config,nuget 不会创建它。

4

2 回答 2

0

.transform 过程不区分键或值属性。它们都只是属性。因此,它没有意识到您的特定更改是无关紧要的,并且不需要再次添加定义的元素。

http://docs.nuget.org/docs/creating-packages/configuration-file-and-source-code-transformations

当 NuGet 将转换文件合并到项目的配置文件中时,它只添加元素或向配置文件中的现有元素添加属性;它不会以任何其他方式更改现有元素或属性。

对于所有 nuGet 所知,value="MyApp" 可能会定义其特定包所需的某些内容,如果该元素 + 属性不逐字存在,则该包将无法运行。

于 2013-12-12T17:17:41.303 回答
0

面临同样的问题。在我的例子中,我们的 CI 服务器构建项目时添加了重复的密钥,从而导致测试失败。

我已经解决了这个问题,注释掉了每个元素。所以我的app.config.transform文件是:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
     <!--add key="handlerId" value="MyApp"/-->
  </appSettings>
 </configuration>

安装软件包时,用户可以取消注释新设置。

不是一个很好的解决方案,但它有效。

于 2015-01-28T15:45:18.880 回答