Каковы наилучшие методы использования атрибутов сборки?

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

Вопрос

У меня есть решение с несколькими проектами.Я пытаюсь оптимизировать файлы AssemblyInfo.cs, связав один файл информации о сборке для всего решения.Каковы наилучшие методы для этого?Какие атрибуты должны быть в файле всего решения, а какие относятся к конкретному проекту / сборке?


Редактировать:Если вам интересно, есть следующий вопрос В чем различия между AssemblyVersion, AssemblyFileVersion и AssemblyInformationalVersion?

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

Решение

Мы используем глобальный файл под названием GlobalAssemblyInfo.cs и локальный файл под названием AssemblyInfo.cs.Глобальный файл содержит следующие атрибуты:

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

Локальный файл AssemblyInfo.cs содержит следующие атрибуты:

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

Вы можете добавить GlobalAssemblyInfo.cs, используя следующую процедуру:

  • Выберите Добавить / Существующий элемент... в контекстном меню проекта
  • Выберите GlobalAssemblyInfo.cs
  • Разверните кнопку "Добавить", нажав на маленькую стрелку вниз справа
  • Выберите "Добавить как ссылку" в выпадающем списке кнопок

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

В моем случае мы создаем продукт, для которого у нас есть решение Visual Studio, с различными компонентами в их собственных проектах.Уходят общие атрибуты.В решении имеется около 35 проектов и общая информация о сборке (CommonAssemblyInfo.cs), которая имеет следующие атрибуты:

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

Другие атрибуты, такие как AssemblyTitle, AssemblyVersion и т.д., мы предоставляем отдельно для каждой сборки.При сборке сборки в каждую сборку встраиваются как AssemblyInfo.cs, так и CommonAssemblyInfo.cs.Это дает нам лучшее из обоих миров, когда вы можете захотеть иметь некоторые общие атрибуты для всех проектов и конкретные значения для некоторых других.

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

Решение, представленное @JRoppert, почти такое же, как то, что я делаю.Единственное отличие заключается в том, что я поместил следующие строки в локальный файл AssemblyInfo.cs, поскольку они могут варьироваться в зависимости от каждой сборки:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

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

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Который установит значение "ProductVersion", отображаемое проводником Windows.

Задачи сообщества MSBuild содержит пользовательскую задачу под названием AssemblyInfo, которую вы можете использовать для создания вашего assemblyinfo.cs.Для использования этого требуется небольшое ручное редактирование ваших файлов csproj, но оно того стоит.

На мой взгляд, использование GlobalAssemblyInfo.cs доставляет больше хлопот, чем того стоит, потому что вам нужно изменять каждый файл проекта и не забывать изменять каждый новый проект, тогда как по умолчанию вы получаете AssemblyInfo.cs.

Для изменения глобальных значений (т. е.Компания, Продукт и т.д.) Изменения обычно настолько редки и просты в управлении, что я не думаю СУХОЙ следует принять это во внимание.Просто запустите следующий скрипт MSBuild (зависит от Пакет расширений MSBuild) когда вы хотите вручную изменить значения во всех проектах единовременно:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>

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

Чтобы сделать это, добавьте существующий файл и нажмите на "Добавить как ссылку" в окне выбора файлов.Add As Link
(источник: free.fr)

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

Использование одного файла AseemblyInfo.cs для нескольких проектов не рекомендуется.Файл AssemblyInfo содержит информацию, которая может быть актуальна только для этой конкретной сборки.Двумя наиболее очевидными фрагментами информации являются AssemblyTitle и AssemblyVersion.

Лучшим решением могло бы быть использование targets файл, который обрабатывается MSBuild, чтобы "внедрить" атрибуты сборки в несколько проектов.

Одна вещь, которую я нашел полезной, - это генерировать элементы AssemblyVersion (etc), применяя замену токенов на этапе предварительной сборки.

Я использую TortoiseSVN, и его легко использовать SubWCRev.exe чтобы перевернуть шаблон AssemblyInfo.wcrev в AssemblyInfo.cs.Соответствующая строка в шаблоне может выглядеть примерно так:

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

Тогда третьим элементом является номер редакции.Я использую четвертый элемент, чтобы проверить, что я не забыл зафиксировать какие-либо новые или измененные файлы (четвертый элемент равен 00, если все в порядке).

Кстати, добавьте AssemblyInfo.wcrev к вашему управлению версиями и игнорировать AssemblyInfo.cs если вы воспользуетесь этим.

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