Программное получение файлов содержимого и основного вывода

StackOverflow https://stackoverflow.com/questions/811691

  •  03-07-2019
  •  | 
  •  

Вопрос

По какой-то причине у нас есть сценарий, который создает пакетные файлы для XCOPY наших скомпилированных сборок, файлов конфигурации и различных других файлов в общий сетевой ресурс для наших бета-тестеров.У нас есть установщик, но у некоторых нет разрешений, необходимых для его запуска, или они работают через Citrix.

Если вас вырвало на весь стол при упоминании XCOPY и Citrix, используйте это как предлог, чтобы пойти домой пораньше.Пожалуйста.

В настоящее время код содержит сотни строк, например:

CreateScripts(basePath, "Client", outputDir, FileType.EXE | FileType.DLL | FileType.XML | FileType.CONFIG);

Раньше было хуже: 20 параметров int (по одному на каждый тип файла) определяли, копировать ли этот тип файла в выходной каталог.

Эти сотни строк создают пакетные файлы загрузки/выгрузки с тысячами строк XCOPY.В наших проектах установки мы можем ссылаться на такие вещи, как «Основной вывод клиента» и «Файлы содержимого клиента».Мне бы хотелось сделать это программно из неустановленного проекта, но я в растерянности.

Очевидно, что MS делает это либо с помощью API, либо путем анализа файлов .csproj.Как бы я это сделал?Я просто ищу способ получить список файлов для любой из категорий установки, т.е.:

  • Первичный выход
  • Локализованные ресурсы
  • Файлы содержимого
  • Файлы документации

РЕДАКТИРОВАТЬ:У меня есть проект установки, как предложил Хат, и он на полпути к тому, что я ищу.Единственная проблема, которая не позволяет этому решению стать идеальным, заключается в том, что несколько проектов зависят от того, что одни и те же сборки находятся в их собственной папке, и программа установки скопирует файл только один раз.

Пример:

Проекты «Администратор», «Клиент» и «Сервер» используют ExceptionHandler.dll, а «Администратор» и «Клиент» используют Util.dll, а сервер — нет.Это то, что я ищу:

  • Админ
    • Админ.exe
    • Админ.exe.config
    • ExceptionHandler.dll
    • Util.dll
  • Клиент
    • Клиент.exe
    • Клиент.exe.config
    • ExceptionHandler.dll
    • Util.dll
  • Сервер
    • Сервер.exe
    • Сервер.exe.config
    • ExceptionHandler.dll

Поскольку все указанные сборки одинаковы, я получаю следующее:

  • Админ
    • Админ.exe
    • Админ.exe.config
    • ExceptionHandler.dll
    • Util.dll
  • Клиент
    • Клиент.exe
    • Клиент.exe.config
  • Сервер
    • Сервер.exe
    • Сервер.exe.config

Это вызывает исключение FileNotFoundException, когда клиент или сервер не могут найти одну из двух ожидаемых библиотек DLL.

Есть ли свойство настройки, которое мне не хватает, чтобы оно всегда копировало выходные данные, даже если они дублируются в другом месте в выходных данных другого проекта?

РЕДАКТИРОВАТЬ СНОВА:Для всех ссылочных DLL установлено значение «Копировать локально», и так было всегда.Я нашел достойную статью о использование NAnt и XSLT для получения списка файлов, так что это тоже может быть возможным решением, как предположил neouser99.

ПРИНЯТОЕ РЕШЕНИЕ:Я почти вернулся к тому, с чего начал.Все выходные данные .exe и .dll помещаются в неплотно упакованный каталог «bin» проекта установки.Другие папки каждого приложения содержат ярлыки для исполняемого файла в этом каталоге.

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

Это было полезно?

Решение

почему бы не использовать другой проект установки и просто установить для параметра «Файлы пакета» значение «Как свободные несжатые файлы» (проект установки-> свойства)?тогда поделитесь папкой..или что-то.

редактировать:

Я вижу, у вас есть 3 папки для ваших результатов.но проект установки обнаруживает ExceptionHandler.dll и Util.dll только один раз, поэтому он просто выберет первую папку и поместит ее туда.

Вы можете создать проект установки для каждого проекта - возможно, это немного раздражает..

Вы можете вручную добавить в DLL к проектам, в которых отсутствует сборка, добавляя в файл «добавить файл» или «добавить сборку» или «добавить вывод проекта», если у вас есть эти проекты в том же решении.(хотя я сомневаюсь, что это так).

или просто сбросить их все в один выходной каталог...

Другие советы

Хотя он разработан как инструмент сборки, вы можете обнаружить НАнт быть чрезвычайно полезным в том, о чем вы говорите.Задачи (сборка, копирование, перемещение, удаление и т. д.), которые вы можете определить, позволяют выполнять очень детальный поиск файлов, вплоть до общих, полных папок.Если вы также включите NAnt в свой процесс сборки, я думаю, вы обнаружите, что это поможет во многих отношениях.

Другой подход, который работал у меня в прошлом, — это добавить общий ресурс (сборку, DLL или проект) в качестве ссылки на каждый из проектов администратора, сервера и клиента.Затем откройте панель свойств для элемента, на который есть ссылка, в каждом проекте и установите для параметра «Копировать локально» значение true.

Теперь, когда вы создаете проекты, каждый из них будет иметь собственный экземпляр сборки, скопированный в выходную папку.

Это также должно привести к тому, что добавленные таким образом общие компоненты будут реплицироваться в каждой выходной папке установочного пакета.

Совершенно другой подход может заключаться в том, чтобы настроить их как символические ссылки на общем сетевом ресурсе.Символическая ссылка — это, по сути, ярлык, при котором файловая система скрывает тот факт, что это ярлык, поэтому все другие приложения фактически считают, что файл был скопирован (http://en.wikipedia.org/wiki/NTFS_symbolic_link).

Одним из преимуществ этого подхода является то, что файл обновляется сразу же при его изменении, а не только при создании проектов.Поэтому, когда вы, например, сохраняете один из конфигурационных файлов с помощью текстового редактора, обновление применяется немедленно.

Следующая часть сценария MSBuild может создать ваш файл SLN (вы можете заменить его на .csproj) и выдаст список всех собранных проектов (Dll, EXE).

 <MSBuild Projects="MySolution.sln" Targets="Clean; Rebuild" Properties="Configuration=$(BuildMode);">
    <Output TaskParameter="TargetOutputs"
                ItemName="AssembliesBuilt" />
    </MSBuild>

На самом деле это не решает вашу проблему, но дает вам список всего, что было построено.У вас также есть copylocal, поэтому вы, вероятно, можете просто взять AssembiesBuild и скопировать оттуда все файлы DLL и .CONFIG.

Пример:

AssembliesBuild = c:\myproj\something1\build.dll

вы должны пойти в c:\myproj\something1\ и просто найти все файлы *.dll и *.config и включить их.Вы можете сделать это довольно легко с помощью MSBuild или PowerShell, если они у вас установлены.Я думаю, что для вывода сценария XCOPY из MSBuild вам понадобится установленный проект MSBuild contrib.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top