[英]How to only add a file if it doesn't already exist using Nuget and the nuspec file
創建nuget包並設置nuspec文件時,有沒有辦法僅在不存在的情況下添加該文件?
我不希望每次更新都替換文件。
我已經看到了這個答案 ,但是它似乎並不完整。
假設我希望一個名為“ example.css”的文件包含在一個新項目中,但是僅在首次安裝時,我該如何實現?
在我的nuspec文件中,我將顯示以下行:
<file src="css\example.css" target="content/css" />
但是它會覆蓋那里的所有內容。
如何僅使用Nuget和nuspec文件添加文件(如果尚不存在)
自昨天以來,我一直在為這個問題苦難。 首先,我的想法與您問題中提供的鏈接中的可接受答案相同,使用Tools
文件夾中的install.ps1
,其功能是,如果example.css
文件已經存在,則nuget update不會覆蓋它。 因此,我嘗試創建此install.ps1
,但失敗了。
那是因為:
install.ps1
。 詳細原因1:
根據文檔在安裝和刪除NuGetpackage期間運行PowerShell腳本 :
在項目中安裝軟件包時,將運行
Install.ps1
。
我們可以獲取隱藏的信息,在安裝軟件包后運行文件Install.ps1
。
為了驗證它,我使用.nuspec
創建了一個測試樣本nuget包:
<?xml version="1.0"?>
<package >
<metadata>
<id>MyTestPackage</id>
<version>1.0.0</version>
<authors>Tester</authors>
<owners>Tester</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Package description</description>
<releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
<copyright>Copyright 2018</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
<files>
<file src="bin\Debug\MyTestPackage.dll" target="lib\net462" />
<file src="css\example.css" target="content\css\example.css" />
<file src="Tools\install.ps1" target="Tools\install.ps1" />
</files>
</package>
以及install.ps1
的內容:
Start-Sleep -Seconds 20
write-host "Hello world!"
Start-Sleep -Seconds 5
然后我將MyTestPackage.nupkg
添加到測試項目,發現執行install.ps1
之前添加到項目中的內容 。
然后,我在example.css
文件中創建了具有不同內容的2.0.0版本(僅供測試),然后將軟件包從1.0.0更新為2.0.0,在執行install.ps1
之前將替換example.css
:
當我們更新nuget軟件包時,nuget將更新該軟件包並首先覆蓋內容,然后執行文件install.ps1
。 因此,似乎我們不能使用文件install.ps1
來防止NuGet覆蓋文件example.css
文件。
詳細原因2:
如果你留意上面的動畫升級過程中,你會發現,升級包時,會的NuGet 首先刪除軟件包,包括內容,然后重新安裝新版本的包。 因此,當我們更新軟件包時,nuget會首先刪除該軟件包及其內容,條件判斷文件存在的結果始終為負。 NuGet會將新版本nuget包中的.css文件添加到項目中。
如果您必須防止nuget覆蓋此文件,則可以使用新的nuget包中的此文件,以解決此問題。升級原始程序包時,新的nuget程序包。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.