2009-05-01 3 views
4

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

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

код в настоящее время имеет сотни линий, как:

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

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

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

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

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

EDIT: У меня есть проект, подобный предложенному Hath, и он находится на полпути к тому, что я ищу. Единственная проблема, заключающаяся в том, что это идеальное решение, заключается в том, что несколько проектов зависят от тех же сборок, которые находятся в их собственной папке, и установка будет копировать только один файл.

Пример:

Проектов Admin, клиент и сервер все полагаются на ExceptionHandler.dll и администратор и клиент и полагаться на Util.dll, в то время как сервер не делает. Это то, что я ищу:

  • Администратор
    • Admin.exe
    • Admin.exe.config
    • ExceptionHandler.dll
    • Util.dll
  • Клиент
    • Client.exe
    • Client.exe.config
    • ExceptionHandler.dll
    • Util.длл
  • Сервер
    • Server.exe
    • Server.exe.config
    • ExceptionHandler.dll

Поскольку ссылочных сборках все равно, что я получите это:

  • Админ
    • Admin.exe
    • Admin.exe.config
    • ExceptionHandler.dll
    • Util.dll
  • Client
    • Client.exe
    • Client.exe.config
  • Сервер
    • Server.exe
    • Server.exe.config

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

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

EDIT AGAIN: Все ссылки на DLL-файлы установлены в «Копировать локальную» и всегда были. Я нашел достойную статью на using NAnt and XSLT to grab the list of files, так что это может быть и возможным решением, как предположил neouser99.

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

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

Еще раз спасибо за помощь.

ответ

1

Почему бы не использовать другой проект установки и установить параметр «Пакетные файлы» как «Незакрепленные несжатые файлы» (setup project-> properties)? затем поделитесь папкой .. или еще что-нибудь.

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

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

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

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

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

+0

Это работает частично. Я обновил вопрос с проблемой, с которой сталкиваюсь сейчас. –

1

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

+0

Есть ли у вас какие-либо ссылки или примеры того, как получить либо файлы контента, либо проект? Я нашел достойную статью об этом, которую я добавил в исходный пост. –

1

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

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

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

+0

Все они настроены на «Копировать местное», как работает наше текущее решение XCOPY. К сожалению, проект установки обнаруживает общую зависимость как уже существующую, поэтому она не копирует ее во вторую папку. –

0

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

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

0

Следующая часть скрипта 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 projct.