2017-01-09 48 views
1

我有一個NuGet包用下面的Web.config.install.xdtInsertIfMissing中的NuGet Web.config.install.xdt替換現有值

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
    <foo bar="something" xdt:Transform="InsertIfMissing" /> 
</configuration> 

變換初始安裝後,消費者將改變屬性值爲bar,即爲。

<configuration> 
    <foo bar="someothervalue" /> 
</configuration> 

我的問題是,在包的後續更新,我想插入默認值,只有當節點foo不存在。隨着當前變換節點總是被替換回

<configuration> 
    <foo bar="something" /> 
</configuration> 

我試過在xdt:Locator下面的表達式,試圖確定是否該節點已存在,沒有任何運氣。

xdt:Locator="Condition(boolean(//configuration/*[local-name()='foo']))" 
xdt:Locator="XPath(/configuration/foo[1])" 

這些工作正常,當我在Visual Studio中「預覽變換」,但在更新Nuget包期間失敗。我猜Nuget對這些表達式的支持有限,但我無法找到關於這個主題的任何文檔。

我在VS 2015.3測試與NuGet包管理器1996年3月5日和3.4.4.1321,並與2017年VS預覽(26020)

有誰知道如何解決這個問題?

+0

它是一個自定義軟件包還是默認的軟件包?你可以在這裏分享嗎?你是如何更新你的軟件包的?像本文檔一樣:http://blog.nuget.org/20130920/how-to-use-nugets-xdt-feature-examples-and-facts.html•如果缺少當前Web.config中的元素,插入一部分元素,可用的目標部分是否包含不同的元素? –

回答

0

根據您的Web.config.install.xdt文件內容,我在Visual Studio 2015.3中使用NuGet Package Manager 3.5.1996進行了測試。如果foo節點在consum項目中存在,則程序包更新時,foo節點不會被替換。

以下步驟是我所做的,我已經使用app.config.install.xdt和Web.config.install.xdt進行了測試。

  1. 創建一個項目(項目A)包含一個Web.config.install.xdt,它與您的內容相同。
  2. 將項目打包爲NuGet軟件包,然後將Web.config.install.xdt文件添加到此軟件包中的Content文件夾中。
  3. 在包含Web.config文件的其他項目(項目B)上安裝此程序包。並且foo節點將被添加到Web中,配置值爲「something」。
  4. 在Web.config中將「something」修改爲「OtherValue」並保存。
  5. 修改項目A中的一些代碼並將其重新打包爲版本2.0.0。
  6. 更新項目B中的包,並且foo節點值仍顯示爲「OtherValue」。

請注意,更改foo值後,請保存您的項目並重新構建它,以確保它可以構建成功。

+0

@EspenLønnkvist您是否檢查了您的步驟以及是否有任何區別?如果可能,請在此分享您的步驟以幫助我們重現您的問題。 –