2008-09-15 6 views
148

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


Edit: Если вы заинтересованы есть прослеживание Question What are differences between AssemblyVersion, AssemblyFileVersion and AssemblyInformationalVersion?

ответ

194

Мы используем глобальный файл 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, нажав на эту маленькую стрелкой вниз на правой руке
  • Выберите «Add As Link» в кнопках выпадающий список
+0

Какова цель хранения старого файла AssemblyInfo.cs? Когда я автоматизирую штамп версии сборки в GlobalAssemblyInfo.cs, как это обновляет файлы AssemblyInfo.cs, которые у меня есть в моем решении? – D3vtr0n 2011-03-22 17:09:17

1

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

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

+0

Что делать, если у вас есть 20 проектов? Это требует, чтобы я поддерживал 20+ записей в моей конфигурации сборки, только для Versioning. Это кажется очень хромым. Что делать, если я добавлю 2 или 3 новых проекта? Это определенно нарушит процесс сборки ... Любые идеи, как решить это? – D3vtr0n 2011-03-22 20:43:55

+0

@ D3vtr0n Я думаю, что идея состоит в том, чтобы генерировать релевантную сборку динамически и не поддерживать индивидуальные конфигурации для каждого проекта. Задачи сообщества, я думаю, обрабатывают этот случай. – Roman 2013-01-23 20:50:25

3

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

Для этого добавьте существующий файл и нажмите «Добавить как ссылку» в селекторе файлов. Add As Link http://laurent.etiemble.free.fr/dotclear/images/AddLinkedFile03_tn.png

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

15

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

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

8

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

12

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

4

На мой взгляд, использование 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> 
1

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

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

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

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

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