it-swarm-ru.tech

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

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


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

160
Jakub Šturc

Мы используем глобальный файл с именем 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
  • Разверните Add-Button, нажав на маленькую стрелку вниз справа
  • Выберите "Добавить как ссылку" в выпадающем списке кнопок
204
JRoppert

В моем случае мы создаем продукт, для которого у нас есть решение 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 и т.д., Мы предоставляем для каждой сборки. При сборке Assembly оба AssemblyInfo.cs и CommonAssemblyInfo.cs встроены в каждую сборку. Это дает нам лучшее из обоих миров, где вы можете захотеть иметь общие атрибуты для всех проектов и конкретные значения для некоторых других.

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

19
Krishna

Решение, представленное @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.

13
Scott Dorman

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

8
jlew

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

Что касается изменений в глобальных значениях (то есть компании, продукта и т.д.), То изменения, как правило, настолько редки и просты в управлении, что я не думаю, что DRY должно быть соображением. Просто запустите следующий скрипт MSBuild (в зависимости от MSBuild Extension Pack ), если вы хотите вручную изменить значения во всех проектах как разовые:

<?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>
5
Schneider

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

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

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

3
Cameron MacFarland

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

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

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

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

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

1
John Denniston

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

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

1
SaguiItay