我有一个在项目中应用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不会创建它。
答案 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>
安装软件包时,用户可以取消注释新设置。
不是一个很好的解决方案,但它确实有效。