- PVSM.RU - https://www.pvsm.ru -
Code Contracts [1] были созданы командой разработчиков из Microsoft Research в 2008 году. Задача Code Contracts описывать предположения о состоянии в коде, которые в последующем используются для проверки кода на корректность и генерации документации. Предполагалось что Code Contracts станут часть платформы .NET и получат поддержку в компиляторе, платформе и Visual Studio. К сожалению, поддержка появилась только в платформе в виде классов пространства имен System.Diagnostics.Contracts. Для остального требуются плагины и дополнительные утилиты.
В данный момент проект поддерживает SergeyT [2] и еще несколько участников.
Для проектов которые разрабатываются на Windows и .NET инфраструктура Code Contracts понятна и более менее развита. Есть Build Steps для MSBuild, можно переписывать/верифицировать сборки с помощью утилит, есть плагины для VS и Resharper. Но с Mono дела обстоят плачевно, есть самодельный ccrewrite [3], который ломается на сложном коде. Поддержки в xbuild и MonoDevelop нет и простым способом собрать проект нельзя.
— Внешняя зависимость проекта от утилит Code Contracts, без которых проект не собрать
— Скорость компиляции ниже, из за дополнительного шага в виде перезаписи сборки
— Отсутствие поддержки в Mono
— Неудобств стало больше чем пользы
Благодаря проекту Roslyn [4] от Microsoft анализ и обработка исходного кода на C#/VB.NET стало довольно тривиальной задачей. И я выбрал этот путь для удаления Code Contracts из исходного кода. Само решение довольно простое и состоит из CSharpSyntaxRewriter [5], который пробегает по коду и заменяет проверки Code Contracts на их эквивалент вне Code Contracts.
Сам удалитель Code Contract'ов оформлен в виде пакета Nuget [6] и доступен как утилита и работает под Mono.
Install-Package CodeContractsRemover
И команда на перезапись всех исходников в директории проекта:
# code_contracts_remover.exe <Convert|Remove> <directoryPath> [searchPattern=*.cs] [encoding=utf-8]
mono packages/CodeContractsRemover.1.0.2/tools/code_contracts_remover.exe Convert ./
Если вы не хотите попрощаться с контрактами навсегда, то вы можете использовать данную утилиту как шаг сборки на вашем билд сервере.
Проект на GitHub [7]
Nuget пакет [8]
Автор: shai_hulud
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/142463
Ссылки в тексте:
[1] Code Contracts: https://www.microsoft.com/en-us/research/project/code-contracts/
[2] SergeyT: https://habrahabr.ru/users/sergeyt/
[3] ccrewrite: http://www.mono-project.com/docs/about-mono/releases/2.8.0/#codecontracts
[4] Roslyn: https://github.com/dotnet/roslyn
[5] CSharpSyntaxRewriter: https://joshvarty.wordpress.com/2014/08/15/learn-roslyn-now-part-5-csharpsyntaxrewriter/
[6] пакета Nuget: http://Install-Package CodeContractsRemover
[7] Проект на GitHub: https://github.com/deniszykov/code-contracts-remover
[8] Nuget пакет: https://www.nuget.org/packages/CodeContractsRemover/
[9] Источник: https://habrahabr.ru/post/302516/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.