在新解决方案上安装时,app.config转换问题

时间:2013-12-12 14:19:19

标签: nuget xdt

我有一个在项目中应用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,但是如果我更改其中一个参数的值并更新/重新安装包,它会创建该参数的副本,其值为package而不是跳过它。

例如: 在清洁项目上安装包

<?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不会创建它。

2 个答案:

答案 0 :(得分:0)

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

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

  

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

对于所有nuGet都知道,value =“MyApp”可以定义其特定包所需的内容,如果该元素+属性不是逐字的,则包将无法运行。

答案 1 :(得分:0)

面对同样的问题。就我而言,当我们的CI服务器构建项目时,会添加重复的密钥,从而导致测试失败。

我已经解决了每个元素的评论。所以我的app.config.transform文件是:

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

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

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