Как добавить файл, только если он еще не существует, используя Nuget и файл nuspec
Я страдаю из-за этой проблемы со вчерашнего дня.Во-первых, у меня та же идея, что и у принятого ответа по ссылке, приведенной в вашем вопросе, с использованием install.ps1
в папке Tools
с функцией, что если файл example.css
уже существует, обновление nuget не будет перезаписывать его.Поэтому я попытался создать install.ps1
, но мне это не удалось.
Это потому, что:
- Файл
install.ps1
запускает после , в который установлен пакетпроект. - Пакет обновления удалит пакет старой версии, включая содержимое.
Подробно по причинам 1:
Согласно документу Запуск сценария PowerShell во время установки и удаления NuGetpackage :
Install.ps1
запускается, когда пакет установлен в проекте.
Мы можем получить скрытую информацию, файл Install.ps1
запускается после установки пакета.
Чтобы проверить это, я создал тестовый пакет nuget с .nuspec
:
<?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
было выполнено .
Затем я создал версию 2.0.0 с другим содержимым в файле example.css
(только для тестирования), затем обновил пакет с 1.0.0 до 2.0.0, example.css
будет заменендо того, как install.ps1
было выполнено:
Когда мы обновляем пакет nuget, nuget сначала обновит пакет и перезапишет содержимое, а затем запустит файл install.ps1
.Поэтому кажется, что мы не могли использовать файл install.ps1
, чтобы предотвратить перезапись файла NuGet файлом example.css
.
Подробно по причинам 2:
Если вы платитеОбратите внимание на процесс обновления в приведенной выше анимации. Вы обнаружите, что при обновлении пакета nuget удалит пакет, включающий содержимое сначала , а затем переустановит пакет новой версии.Итак, nuget сначала удалит пакет и его содержимое, когда мы обновим пакет, результат существования файла условного суждения всегда отрицателен.NuGet добавит файл .css в пакет новой версии nuget в проект.
Если вам нужно предотвратить перезапись Nuget этим / этими файлами, в качестве обходного пути для этой проблемы вы можете включить эту / тефайл (ы) в новом пакете nuget, эти / те файлы не будут перезаписаны в новом пакете nuget при обновлении исходного пакета.
Надеюсь, это поможет.