2013-12-12 64 views
2

我有一个将app.config转换应用于项目的包。转换文件看起来像这样在新解决方案上安装时发生的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不会创建它。

回答

0

.transform过程不区分键或值属性。他们都是属性。因此,它没有意识到你的特定变化是无关紧要的,而且它不需要再次添加已定义的元素。

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

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

对于所有nuGet知道的值=“MyApp”可以定义其特定包所需的东西,并且如果该元素+属性不是逐字的,那么该包将不起作用。

+0

我用xdt trasformations文件解决了这个问题,正如我所说的那样。如果我可以用xdt创建app.config文件,那将会很棒,所以我需要一些方法来合并这些方法 – Redwan

0

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

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

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

当您安装包是由用户以取消新的设置。

不是一个很好的解决方案,但它的工作原理。