Обновление Wixsharp не сохраняет прежние настройки, такие как данные БД и другие конфигурации - PullRequest
1 голос
/ 09 апреля 2020

Я использую wixsharp для сборки моего установщика. Каждый раз, когда я даю новую сборку, я хочу обновить все свои exe, dll и другие двоичные файлы, но я хочу сохранить вручную измененные настройки, например, у нас есть возможность сохранить некоторые ключи в базе данных, которые создадут несколько папок внутри папки приложения в файлах программы. Я хочу сохранить эти данные и заменить двоичные файлы, но при обновлении они также удаляются.

Я использую приведенный ниже код wixsharp для осуществления обновления.

project.UpgradeCode= new Guid("some GUID here, keeping it same in all builds");
project.ProductId = new Guid("GUID here, changing it in all incremental build");
project.Version = new Version(6, 1, 1, 1); // upgrading it in incremental builds
            project.MajorUpgrade = new MajorUpgrade
            {
                Schedule = UpgradeSchedule.afterInstallValidate,
                AllowSameVersionUpgrades = true,
                MigrateFeatures =true,
                IgnoreRemoveFailure=true,
                DowngradeErrorMessage="A new version of this product is already installed."
            };

Еще один Проблема, с которой я сталкиваюсь, заключается в том, что, когда мы устанавливаем 2-ую сборку, она не показывает опцию обновления, а показывает только опцию установки (например, установка fre sh) и, наконец, запрашивает у пользователя разрешение на удаление продукта, то есть удаление. старый продукт кажется, но он не выглядит удобным для пользователя, поскольку пользователь может чувствовать, почему он / она удаляет продукт. Я просто хочу вариант обновления, который может выполнить обновление, не показывая пользователю, что происходит в бэкэнде.

1 Ответ

0 голосов
/ 13 апреля 2020

Вопрос 1:

Если вы хотите иметь несколько файлов * stati c, которые добавляются, если они не существуют, но не обновляют их новой установкой. Вам нужно пометить их Permanent = "yes" NeverOverwrite = "yes" атрибутов.

Для получения дополнительной информации ссылка здесь: Элемент Wix Component

Как сделать это с WixSharp?

Вот мой код, как сделать index. html и web.config неизменным:

        var immutableFiles = 
        {
            @"index.html",
            @"web.config"
        };
// ....
        var wixObjects = new WixObject[]
        {
            new Dir(
                @"%ProgramFiles%\YourProductFolderName\",
                WixFilesBuilderUtils.BuildDirectoryInfo(BinariesRoot, immutableFiles)),
            // Properties etc...
        }.ToArray();

        var project = new ManagedProject("name",  wixObjects);

Код строителя:

 public class WixFilesBuilderUtils
{
    public static WixEntity[] BuildDirectoryInfo(string currentRoot, IEnumerable<string> immutableFiles)
    {
        var result = new List<WixEntity>();
        var currentRootDictionaryInfo = new DirectoryInfo(currentRoot);
        var localImmutableFiles = immutableFiles.Select(fileName => fileName.ToLower()).ToArray();

        var currentRootDirList = currentRootDictionaryInfo
            .GetDirectories()
            .Select(dirInfoSub => dirInfoSub.FullName).ToArray();

        result.AddRange(
            Directory.GetFiles(currentRootDictionaryInfo.FullName)
                .Select(
                    filePath => new WixSharp.File(filePath)
                    {
                        Attributes = MarkFileAsPersonal(filePath, localImmutableFiles)
                    })
                .Cast<WixEntity>());

        if (currentRootDirList.Any())
        {
            var subDirs = currentRootDirList
                .Select(dirPath => new DirectoryInfo(dirPath))
                .Select(
                    rootSubDirInfo =>
                        new Dir(rootSubDirInfo.Name,
                            BuildDirectoryInfo(rootSubDirInfo.FullName, localImmutableFiles)))
                .Cast<WixEntity>();

            result.AddRange(subDirs);
        }

        return result.ToArray();
    }

    private static Dictionary<string, string> MarkFileAsPersonal(string path, IEnumerable<string> immutableFiles)
    {
        return immutableFiles.Any(path.ToLower().EndsWith)
                   ? new Dictionary<string, string>
                       {
                           { "Component:Permanent", "yes" },
                           { "Component:NeverOverwrite", "yes" }
                       }
                   : new Dictionary<string, string>();
    }
}

Вопрос 2:

Пожалуйста, попробуйте использовать одинаковые GUID UpdateCode и ProductCode для каждой сборки и этой одной стратегии:

MajorUpgradeStrategy = new MajorUpgradeStrategy
            {
                RemoveExistingProductAfter = Step.InstallInitialize,
                UpgradeVersions = VersionRange.OlderThanThis,
                PreventDowngradingVersions = VersionRange.NewerThanThis,
                NewerProductInstalledErrorMessage = "."
            };
...