Как добавить файл, только если он еще не существует, используя Nuget и файл nuspec - PullRequest
0 голосов
/ 18 сентября 2018

При создании пакета nuget и настройке файла nuspec, есть ли способ добавить файл, только если он еще не существует?

Я не хочу заменять файл при каждом обновлении.

Я видел этот ответ , но он не завершен.

Допустим, я хочу, чтобы файл с именем "example.css" был включенв новом проекте, но только при первой установке, как мне этого добиться?

В моем файле nuspec у меня будет такая строка:

<file src="css\example.css" target="content/css" />

Но она перезаписывает все, что там есть.

1 Ответ

0 голосов
/ 20 сентября 2018

Как добавить файл, только если он еще не существует, используя Nuget и файл nuspec

Я страдаю из-за этой проблемы со вчерашнего дня.Во-первых, у меня та же идея, что и у принятого ответа по ссылке, приведенной в вашем вопросе, с использованием install.ps1 в папке Tools с функцией, что если файл example.css уже существует, обновление nuget не будет перезаписывать его.Поэтому я попытался создать install.ps1, но мне это не удалось.

Это потому, что:

  1. Файл install.ps1 запускает после , в который установлен пакетпроект.
  2. Пакет обновления удалит пакет старой версии, включая содержимое.

Подробно по причинам 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 было выполнено:

enter image description here

Когда мы обновляем пакет nuget, nuget сначала обновит пакет и перезапишет содержимое, а затем запустит файл install.ps1.Поэтому кажется, что мы не могли использовать файл install.ps1, чтобы предотвратить перезапись файла NuGet файлом example.css.

Подробно по причинам 2:

Если вы платитеОбратите внимание на процесс обновления в приведенной выше анимации. Вы обнаружите, что при обновлении пакета nuget удалит пакет, включающий содержимое сначала , а затем переустановит пакет новой версии.Итак, nuget сначала удалит пакет и его содержимое, когда мы обновим пакет, результат существования файла условного суждения всегда отрицателен.NuGet добавит файл .css в пакет новой версии nuget в проект.

Если вам нужно предотвратить перезапись Nuget этим / этими файлами, в качестве обходного пути для этой проблемы вы можете включить эту / тефайл (ы) в новом пакете nuget, эти / те файлы не будут перезаписаны в новом пакете nuget при обновлении исходного пакета.

Надеюсь, это поможет.

...