обновление ссылок проекта .NET (в конфигурационном файле) - PullRequest
4 голосов
/ 21 ноября 2011

У меня есть решение, состоящее из ряда проектов, в том числе:

Foo.Bar.Client
Foo.Common

Foo.Bar.Client зависит от компонентов в Foo.Common.И, Foo.Common не имеет своего собственного файла конфигурации;его настройки хранятся в файле конфигурации клиентского приложения, использующего его, в данном случае Foo.Bar.Client.
Таким образом, файл конфигурации для Foo.Bar.Client содержит

  <configSections>
    <section name="BletchConfiguration" 
             type="Foo.Common.Bletch, Version=1.1.0.0, ..."/>
    ....
  </configSections>

Мне порученоизменив нумерацию версий так, чтобы часть «редакция» соответствовала последнему набору изменений (в нашем случае это номер редакции HEAD, так как мы используем Subversion), например, от «1.1.0.0» до «1.1.0.12345».

Итак, я реализовал «общий» модуль информации о версии сборки, как описано здесь .И я изменил наш скрипт сборки NAnt, чтобы получить номер версии и обновить общий файл информации о сборке.

Однако я не рассчитывал на то, что номера версий будут встроены в файл (ы) конфигурации.Есть ли (относительно) безболезненный способ автоматизировать обновление номеров версий в конфигурационных файлах?

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

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Быстрый ответ - если вы не поддерживаете несколько версий Foo.Common.dll в своем приложении, я просто опущу номер версии в разделе конфигурации.

<configSections>
    <section name="BletchConfiguration" 
         type="Foo.Common.Bletch, Foo.Common"/>
    ....
</configSections>

Это не относится к области 'section' структуры файла конфигурации - это неотъемлемая вещь .net - и соглашение используется повсеместно.

[EDIT]

Я не могу найти какую-либо документацию, конкретно касающуюся того, какие части являются необязательными. Документация MSDN просто заявляет структуру http://msdn.microsoft.com/en-us/library/ms228245.aspx Однако по памяти и небольшим экспериментам ... (это довольно гибко - квадратные скобки означают необязательно)

Если ваша DLL находится в GAC - вам потребуется версия ... FullTypeAndNamespace, AssemblyNameWithoutExtension, Version, Culture, PublicKeyToken [,PlatformType]

Если ваша DLL находится в каталоге bin FullTypeAndNamespace, AssemblyNameWithoutExtension [,Version, Culture, PublicKeyToken] [,PlatformType]

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

Дополнительные компоненты могут быть в любом порядке (поскольку они структурированы как пары ключ = значение, порядок не имеет значения). Просто укажите элементы, которые вы хотите ограничить, опустите остальные.

Итак, в приведенном мной примере CLR загрузит первую DLL, которая соответствует имени и содержит требуемый тип.

1 голос
/ 23 ноября 2011

Я бы не стал пересматривать мой AssemblyVersion так часто.Вам следует сохранять AssemblyFileVersion для каждой сборки (чтобы вы могли различить их), но сохранение AssemblyVersion для каждой сборки весьма проблематично.

В чем различия между AssemblyVersion, AssemblyFileVersion и AssemblyInformationalVersion?

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

Вот скрипт для обновления фактической AssemblyVersion:

get-childitem . -rec -include AssemblyInfo.cs | select-string "assembly: AssemblyVersion(" -simplematch -list | % { & p4 sync $_.path; & p4 edit $_.path; (get-content $_.Path) |% { $_ -replace "assembly: AssemblyVersion\(`"\d\.\d\.\d\.\d", "assembly: AssemblyVersion(`"2.0.0.0" } | set-content $_.Path -Encoding UTF8 }

Вот один из них, чтобы обновить ссылку на проекты с 1.5.0.0до 2.0.0.0:

get-childitem . -rec -include *.csproj | select-string "<Reference Include=`"Acme.SomeProduct," -simplematch -list | % { & p4 sync $_.path; & p4 edit $_.path; (get-content $_.Path) |% { $_ -replace "<Reference Include=`"Acme\.SomeProduct, Version=1\.5\.0\.0,", "<Reference Include=`"Acme.SomeProduct, Version=2.0.0.0," } | set-content $_.Path -Encoding UTF8 } 
...