Mono framework что это
Compilation and Installation
Building the Software
Please see our guides for building Mono on Mac OS X, Linux and Windows.
If you don't have a working Mono installation
If you don't have a working Mono installation, you can try a slightly more risky approach: getting the latest version of the 'monolite' distribution, which contains just enough to run the 'mcs' compiler. You do this with:
This will download and place the files appropriately so that you can then just run:
The build will then use the files downloaded by make get-monolite-latest .
Testing and Installation
You can run the mono and mcs test suites with the command: make check .
You can now install mono with: make install
You can verify your installation by using the mono-test-install script, it can diagnose some common problems with Mono's install. Failure to follow these steps may result in a broken installation.
Once you have installed the software, you can run a few programs:
mono program.exe runtime engine
monodis program.exe CIL Disassembler
See the man pages for mono(1), mcs(1) and monodis(1) for further details.
acceptance-tests/ - Optional third party test suites used to validate Mono against a wider range of test cases.
data/ - Configuration files installed as part of the Mono runtime.
docs/ - Technical documents about the Mono runtime.
external/ - Git submodules for external libraries (Newtonsoft.Json, ikvm, etc).
ikvm-native/ - Glue code for ikvm.
libgc/ - The (deprecated) Boehm GC implementation.
llvm/ - Utility Makefiles for integrating the Mono LLVM fork.
m4/ - General utility Makefiles.
man/ - Manual pages for the various Mono commands and programs.
mcs/ - The class libraries, compiler and tools
class/ - The class libraries (like System.*, Microsoft.Build, etc.)
tools/ - Tools like gacutil, ikdasm, mdoc, etc.
mono/ - The core of the Mono Runtime.
arch/ - Architecture specific portions.
benchmark/ - A collection of benchmarks.
btls/ - Build files for the BTLS library which incorporates BoringSSL.
cil/ - Common Intermediate Representation, XML definition of the CIL bytecodes.
dis/ - CIL executable Disassembler.
eglib/ - Independent implementation of the glib API.
metadata/ - The object system and metadata reader.
mini/ - The Just in Time Compiler.
profiler/ - The profiler implementation.
sgen/ - The SGen Garbage Collector implementation.
tests/ - The main runtime tests.
unit-tests/ - Additional runtime unit tests.
utils/ - Utility functions used across the runtime codebase.
msvc/ - Logic for the MSVC / Visual Studio based runtime and BCL build system. The latter is experimental at the moment.
packaging/ - Packaging logic for the OS X and Windows Mono packages.
po/ - Translation files.
runtime/ - A directory that contains the Makefiles that link the mono/ and mcs/ build systems.
samples/ - Some simple sample programs on uses of the Mono runtime as an embedded library.
scripts/ - Scripts used to invoke Mono and the corresponding program.
sdks/ - A new way of embedding Mono into Xamarin.iOS, Xamarin.Android and other products.
support/ - Various support libraries.
tools/ - A collection of tools, mostly used during Mono development.
Contributing to Mono
Before submitting changes to Mono, please review the contribution guidelines. Please pay particular attention to the Important Rules section.
Please use the search facility to ensure the same bug hasn't already been submitted and follow our guidelines on how to make a good bug report.
The following are the configuration options that someone building Mono might want to use:
--with-sgen=yes,no - Generational GC support: Used to enable or disable the compilation of a Mono runtime with the SGen garbage collector.
- On platforms that support it, after building Mono, you will have both a mono-boehm binary and a mono-sgen binary. mono-boehm uses Boehm, while mono-sgen uses the Simple Generational GC.
--with-libgc=[included, none] - Selects the default Boehm garbage collector engine to use.
included: (slightly modified Boehm GC) This is the default value for the Boehm GC, and it's the most feature complete, it will allow Mono to use typed allocations and support the debugger.
none: Disables the inclusion of a Boehm garbage collector.
This defaults to included .
- If you pass this flag the Mono runtime is configured to only use the cooperative mode of the garbage collector. If you do not pass this flag, then you can control at runtime the use of the cooperative GC mode by setting the MONO_ENABLE_COOP_SUSPEND flag.
Controls how Mono should access thread local storage, pthread forces Mono to use the pthread APIs, while __thread uses compiler-optimized access to it.
Although __thread is faster, it requires support from the compiler, kernel and libc. Old Linux systems do not support with __thread.
This value is typically pre-configured and there is no need to set it, unless you are trying to debug a problem.
Experimental: Use at your own risk, it is known to cause problems with garbage collection and is hard to reproduce those bugs.
This controls whether Mono will install a special signal handler to handle stack overflows. If set to yes , it will turn stack overflows into the StackOverflowException. Otherwise when a stack overflow happens, your program will receive a segmentation fault.
The configure script will try to detect if your operating system supports this. Some older Linux systems do not support this feature, or you might want to override the auto-detection.
This controls whether mono should link against a static library (libmono.a) or a shared library (libmono.so).
This defaults to yes , and will improve the performance of the mono program.
This only affects the `mono' binary, the shared library libmono.so will always be produced for developers that want to embed the runtime in their application.
--with-xen-opt=yes,no - Optimize code for Xen virtualization.
It makes Mono generate code which might be slightly slower on average systems, but the resulting executable will run faster under the Xen virtualization system.
This defaults to yes .
--with-large-heap=yes,no - Enable support for GC heaps larger than 3GB.
This only applies only to the Boehm garbage collector, the SGen garbage collector does not use this configuration option.
This defaults to no .
--enable-small-config=yes,no - Enable some tweaks to reduce memory usage and disk footprint at the expense of some capabilities.
Typically this means that the number of threads that can be created is limited (256), that the maximum heap size is also reduced (256 MB) and other such limitations that still make mono useful, but more suitable to embedded devices (like mobile phones).
This defaults to no .
--with-ikvm-native=yes,no - Controls whether the IKVM JNI interface library is built or not.
This is used if you are planning on using the IKVM Java Virtual machine with Mono.
This defaults to yes .
--with-profile4=yes,no - Whether you want to build the 4.x profile libraries and runtime.
--with-libgdiplus=installed,sibling, - Configure where Mono searches for libgdiplus when running System.Drawing tests.
It defaults to installed , which means that the library is available to Mono through the regular system setup.
sibling can be used to specify that a libgdiplus that resides as a sibling of this directory (mono) should be used.
Or you can specify a path to a libgdiplus.
Use this feature to specify optional runtime components that you might not want to include. This is only useful for developers embedding Mono that require a subset of Mono functionality.
aot : Disables support for the Ahead of Time compilation.
attach : Support for the Mono.Management assembly and the VMAttach API (allowing code to be injected into a target VM)
com : Disables COM support.
debug : Drop debugging support.
decimal : Disables support for System.Decimal.
full_messages : By default Mono comes with a full table of messages for error codes. This feature turns off uncommon error messages and reduces the runtime size.
generics : Generics support. Disabling this will not allow Mono to run any 2.0 libraries or code that contains generics.
jit : Removes the JIT engine from the build, this reduces the executable size, and requires that all code executed by the virtual machine be compiled with Full AOT before execution.
large_code : Disables support for large assemblies.
logging : Disables support for debug logging.
pinvoke : Support for Platform Invocation services, disabling this will drop support for any libraries using DllImport.
portability : Removes support for MONO_IOMAP, the environment variables for simplifying porting applications that are case-insensitive and that mix the Unix and Windows path separators.
profiler : Disables support for the default profiler.
reflection_emit : Drop System.Reflection.Emit support
reflection_emit_save : Drop support for saving dynamically created assemblies (AssemblyBuilderAccess.Save) in System.Reflection.Emit.
shadow_copy : Disables support for AppDomain's shadow copies (you can disable this if you do not plan on using appdomains).
simd : Disables support for the Mono.SIMD intrinsics library.
ssa : Disables compilation for the SSA optimization framework, and the various SSA-based optimizations.
This enables the use of LLVM as a code generation engine for Mono. The LLVM code generator and optimizer will be used instead of Mono's built-in code generator for both Just in Time and Ahead of Time compilations.
You will need to have an LLVM built that Mono can link against.
--enable-big-arrays - Enable use of arrays with indexes larger than Int32.MaxValue.
In certain scenarios where large arrays are required, you can pass this flag and Mono will be built to support 64-bit arrays.
This is not the default as it breaks the C embedding ABI that we have exposed through the Mono development cycle.
Use this option to enable the garbage collector to use multiple CPUs to do its work. This helps performance on multi-CPU machines as the work is divided across CPUS.
This option is not currently the default on OSX as it runs into issues there.
This option only applies to the Boehm GC.
- On Solaris and MacOS X builds a version of the Mono runtime that contains DTrace probes and can participate in the system profiling using DTrace.
Mono uses /dev/random to obtain good random data for any source that requires random numbers. If your system does not support this, you might want to disable it.
There are a number of runtime options to control this also, see the man page.
Currently this is used with Mono's AOT engine as Native Client does not support JIT engines yet.
Use this option to configure mono to run on WebAssembly. It will set both host and target to the WebAssembly triplet. This overrides the values passed to --host or --target and ignored what config.sub guesses.
This is a workaround to enable usage of old automake versions that don't recognize the wasm triplet.
Working With Submodules
Mono references several external git submodules, for example a fork of Microsoft's reference source code that has been altered to be suitable for use with the Mono runtime.
This section describes how to use it.
An initial clone should be done recursively so all submodules will also be cloned in a single pass:
Once cloned, submodules can be updated to pull down the latest changes. This can also be done after an initial non-recursive clone:
To pull external changes into a submodule:
By default, submodules are detached because they point to a specific commit. Use git checkout to move back to a branch before making changes:
To switch the repo of a submodule (this should not be a common or normal thing to do at all), first edit .gitmodules to point to the new location, then:
The desired output diff is a change in .gitmodules to reflect the change in the remote URL, and a change in / where you see the desired change in the commit hash.
See the LICENSE file for licensing information, and the PATENTS.TXT file for information about Microsoft's patent grant.
The Benefits
There are many benefits to choosing Mono for application development:
Higher-Level Programming - All Mono languages benefit from many features of the runtime, like automatic memory management, reflection, generics, and threading. These features allow you to concentrate on writing your application instead of writing system infrastructure code.
Base Class Library - Having a comprehensive class library provides thousands of built in classes to increase productivity. Need socket code or a hashtable? There’s no need to write your own as it’s built into the platform.
Cross Platform - Mono is built to be cross platform. Mono runs on Linux, Microsoft Windows, macOS, BSD, and Sun Solaris, Nintendo Wii, Sony PlayStation 3, Apple iPhone and Android. It also runs on x86, x86-64, IA64, PowerPC, SPARC (32), ARM, Alpha, s390, s390x (32 and 64 bits) and more. Developing your application with Mono allows you to run on nearly any computer in existence.
Пример 3. Баги в Mono
Да, в Mono есть баги. И да, их не очень мало, приходится с этим жить. К счастью, попадать на них приходится нечасто, а из открытых багов не так много критичных. Расскажу вам одну историю: при портировании PassportVision на Mono я наткнулся на один не очень приятный момент. Мне пришлось заниматься кодогенерацией и часть логики создавать на лету в зависимости от ряда условий. Я создавал новые типы через TypeBuilder, а типы эти реализовывали определённые интерфейсы. Я узнал очень много нового про генерацию кода в Mono, но большую часть очень сложно кратко поведать в отрыве от контекста. А вот один баг воспроизводился очень легко: метод TypeBuilder.CreateType() не проверял область видимости объявленных интерфейсов. Т. е. код
Данная проблема не особо критична, но ряд неудобств она мне всё-таки доставила. А ведь в баг-трекере всё ещё висит
Mono Feature Highlights
Open Source, Free Software
Mono’s runtime, compilers, and libraries are distributed using the MIT license.
Comprehensive Technology Coverage
Bindings and managed implementations of many popular libraries and protocols
The Components
There are several components that make up Mono:
Mono Runtime - The runtime implements the ECMA Common Language Infrastructure (CLI). The runtime provides a Just-in-Time (JIT) compiler, an Ahead-of-Time compiler (AOT), a library loader, the garbage collector, a threading system and interoperability functionality.
Mono Class Library - Mono also provides many classes that go above and beyond the Base Class Library provided by Microsoft. These provide additional functionality that are useful, especially in building Linux applications. Some examples are classes for Gtk+, Zip files, LDAP, OpenGL, Cairo, POSIX, etc.
Пример 1. Разные версии компилятора
Как видно из примера, значения исходных элементов хранятся в специальном массиве байт. А вот во времена Mono 2.4.4 (можете не верить, но по сей день есть люди, которые им пользуются) транслятор был не настолько умён:
На самом деле тут происходит следующее:
Функционально ничего не поменялось, но теперь у нас имеется осознание того, что разные версии компилятора могут выдавать различный код. Но этот пример не настолько интересен, т. к. поведение кода осталось прежним (если не считать небольшого проседания производительности для старых версий Mono). Давайте перейдём к более интересным примерам.
Other Uses
Scripting and Embedding - The Mono runtime can also be used to script your applications by embedding it inside other applications, to allow managed code and scripts to run in a native application.
See Embedding Mono for details on how to embed Mono.
See Scripting With Mono for strategies on how to script your application using the Mono runtime.
Пример 2. Отличия в работе с IL
Пример 5. Тонкости реализации стандартных классов
Приведу ещё одну поучительную историю. Ребята из одной хорошей фирмы как-то раз решили использовать структуры в качестве ключей для хеш-таблиц. Ничто не предвещало беды, приложение работало нормально. Немного тормозило, но не так, чтобы прям слишком критично. А потом в один прекрасный день ребята решили запустить своё приложение под Mono. И о чудо: оно начало работать в разы быстрее. «Ох, какой хороший Mono, как же быстро под ним всё работает», — обрадовались ребята. Единственное, не давала покоя мысль, что не должно так быть, что где-то что-то не так.
Также надеюсь, что у Хабражителей хватает своих весёлых историй. Буду рад их послушать =)
Представленный пример может быть интересен широкой аудитории, т.к. легко может быть адаптирован для разработки под любую другую платформу.
Вступление
Эта статья никогда бы не была бы написана, если бы не статья-оригинал, которая в своё время сыграла ключевую роль в формировании моего представления о процессе разработки. И, как говориться, «пользуясь случаем хочу». Хочу поблагодарить Евгения за его замечательную статью, которая является просто замечательным стартом для начинающих разработчиков! Огромное тебе спасибо!
В статье последовательно будет описан процесс настройки рабочей среды и создания сборочно проекта, который будет автоматически отслеживать изменения в исходном коде, производить компиляцию проекта, выполнять юнит и функциональные тесты, а так же собирать метрики, такие как количество строк кода, наличие его дубликатов, наличие в исходном коде технических долгов (TODO, FIXME и т.п.) Стержнем проекта будет являтся NAnt-скрипт, который будет наращиваться по мере рассмотрения материала. На любом этапе проект является рабочим и может быть выполнен, что может оказаться очень удобно для тех кто не сумеет создать весь проект за раз либо не нуждается во всем представленном функционале (а он, откровенно говоря, в некоторых вопросах избыточен).
Workspace
Описание демонстрационного проекта
- ExampleCore — в котором сосредоточена вся логика приложения (а это на секундочку, аж целых два метода)!
- ExampleGUI — интерфейс приложения (одна единственная, но от этого ещё более важная, aspx-страница).
- ExampleUTest — проект с тестами (NUnit).
- ExampleFTest — так же в корневом каталоге расположена папка ExampleFTest с функциональными тестами (Selenium), которая не входит в решение.
Создание сборочного скрипта и настройка инструментов
Для простоты объявим свойства, которые в дальнейшем сократят нам код.
Переменная окружения устанавливаемая Jenkins'ом:Директория в которой собраны инструменты:Алиасы различных директорий, назначение которых очевидно из названия:Алиасы бинарного файла и файла настроек StyleCopCmd:Алиасы исполняемого файла, конвертера и файла конфигурации CloneAnalyzer:Алиасы исполняемого файла, обёрточного скрипта, а так же файла с набором тестов и именем хоста на котором развернуто приложение для SeleniumRC:
Приступим к созданию целей.
1. Первым делом создадим цель по очистке сборочной директории от старых артефактов и созданию необходимых директорий:
2. Вторым шагом могло бы быть получения обновлений из репозитория. Поскольку эта операция выполняется Jenkins'ом, то в данном примере NAnt-скрипт её не содержит, но если бы в ней была необходимость, то её место здесь.
Создадим и настроим репозиторий Subversion:
После этого настроим Subversion плагин:
А так же зададим периодичность сборки (производить сборку при наличии обновлений, наличие которых проверять каждый час в рабочие дни недели):
В дальнейшем это позволит получать вот такие отчеты по Warning'ам компилятора:
4. Сгенерируем документацию в формате html:
Настроим плагин DocLinks:В результате на главной странице проекта будет создана ссылка на документацию.
5. Соберём и запустим юнит-тесты:
Настроим плагин NUnit:
Отчеты плагина NUnit выглядят следующим образом:
6. Выполним статический анализ кода при помощи Gendarme:… и StyleCopCmd:Что бы избавиться ошибки, вызываемой StyleCopCmd:Создадим вожделенный файл с правами на запись всем желающим:
Настроим плагин Violations:
Так будут выглядеть отчеты:
Тут есть несколько неприятных моментов: во-первых: для того, что бы успешно отображался детализированный отчет по StyleCop отчет должен лежать в корне проекта (что нарушает общую тенденцию), а во-вторых: детализированный отчет по Gendarme мне так и не удалось настроить (кто сталкивался — прошу помощи).
7. Собираем метрики:
Настроим плагин SLOCCount:
Пример отчета:
8. Выполняем поиск дубликатов в два этапа: сначала запустим приложение CloneAnalyzer, а потом выполним конвертацию полученного отчета:
Настроим плагин DRY:
Пример отчета:
9. Выполним функциональные тесты, для чего сначала развернем приложение, перезапустим web-сервер и собственно запустим тесты:
Для того, что бы пользователь jenkins мог выполнять перезапуск web-сервера, ему необходимо дать соответствующие права:
Для запуска тестов создадим скрип-обёртку, который будет устанавливать необходимые переменные окружения и транслировать через себя параметры командной строки Selenium-серверу:
Настроим Apache. Отредактируем файл /etc/apache/conf.d/mod_mono и укажем расположение приложения:
И создадим конфигурационный файл приложения /etc/apache2/conf.d/Example:
Настроим плагин Selenium:
Пример отчета (Jenkins просто отображает отчет Selenium'a один к одному):На этом формирование NAnt-скрипта закончено.
10. Так же как и задача получения исходного кода из репозитория, так же и задача сканирования кода на предмет открытых задач вызывается непосредственно из Jenkins (минуя Nant-скрипт).
Настроим плагин Task Scanner:
Пример отчета:
Сборочный проект настроен и готов к запуску.
Тюнинг
Буквально в двух словах хотелось бы остановиться на некоторых других плагинах (коих есть огромное количество).
Backup — назначение плагина очевидно из его названия, а его настройка тривиальна. Его описание излишне, т.к. Backup — это самое первое о чем стоит побеспокоиться!
JobConfigHistory — бывает в процессе настройки внесенные изменение в конфигурацию проекта оказываются неудачными и для того, что бы легко вернуться к предыдущей версии необходимо самостоятельно принимать мероприятия по сохранению предыдущей версии. Данные плагин ведет историю изменений и позволяет без труда определить внесенные изменения.
Green Balls — по умолчанию для отображения статуса Jenkins использует три цвета: красный, желтый и синий. Данный плагин позволяет заменить синий цвет на зеленый. Практическая ценность этого плагина весьма сомнительна, а вот эстетическую переоценить тяжело!
Next Build Number — позволяет устанавливать номер следующей сборки. Удобно в случаях, когда при настройке выполняется несколько сборок, которые затем удаляются, а в нумерации образуется дыра. Либо в тех случаях, когда нужно форсировано задать номер версии (например для релиза).
Sidebar-Link — очень любопытный плагин. Позволяет размещать ссылки на главной странице или на страницах проектов. Когда это может быть полезно. Например на главной странице можно разместить ссылку на какой-нибудь корпоративный ресурс, базу знаний или ещё что-нибудь (не забываем, что контент размещенный в директории userContent отображается Jenkinso'ом автоматически).Для создания ссылки на главной странице необходимо выполнить настройку сервера (а не проекта):
В результате на главной странице появиться ссылка Important:
На странице проекта можно разместить ссылку на ресурс специфический для данного проекта (например на svn-репозиторий), или, что может оказаться более полезным, на отчет какой-нибудь утилиты, для которой нет соответствующего Jenkins-плагина. Для создания ссылки на странице проекта, необходимо выполнить его настройку:
Обратите внимание на то, что файлы иконок можно загружать на сервер только через настройки сервера, в настройках проекта эта функция отсутствует.
Вот так будет выглядеть ссылка Subversion на странице проекта.
Вот так в заключении будет выглядеть страница проекта:
А вот так страница отчета по билду:
Пространные рассуждения (вместо нормального заключения)
Конечно же приведенный пример идеализирован.
Во-первых: представленный пример не содержит БД, что крайне редко встречается в жизни и лишает сборочный проект занимательной задачи по поддержанию БД в корректном состоянии (то ли всегда ее собирать из скриптов лежащих под контролем, то ли держать под контролем непосредственно бинарный файл, то ли накатывать на бинарный файл подконтрольные скрипты).
Во-вторых: выполнять сборку на CI Servere очень часто может быть не достаточно, в большинстве случаев целесообразно создавать Matrix-проект поэтому операция развертывания приложения может оказаться несколько сложнее.
В-третьих: Юнит-тесты наверное правильнее выполнять в тестовом окружении, а не на билд-сервере.
В примере не рассмотрен ни один из нотификационных плагинов. На практике же их использование может оказаться необходимо.
В конце-концов на CI Servere может не оказаться X-сервера механизм запуска функциональных тестов в таком случае несколько изменится (на при мер).
Ну и в самом конце, хотелось бы пригласить всех тех, кто предпочитает узнавать об ошибках не через месяц после коммита от заказчика, а на следующий день от билд-сервера, поделиться своим опытом и высказать замечания к представленном примеру.
Я участник Debian Mono Group, Debian CLI Applications Team, и Debian CLI Libraries Team. И уже в течении года работаю над сопровождением пакетов проекта Mono и программ, которые используют его в ОС Ubuntu (и Debian). Мне хорошо известны горячие споры, угрозы и последующие переходы на личности, и сейчас я принимаю ваш «вызов». В этой статье я говорю от себя лично — не от проекта Debian, не от Ubuntu, не от Mono, и не потому, что меня попросил мой начальник.
Почему Mono хорош?
Почему Mono не опасен?
Почему Mono должен быть включен в Ubuntu по-умолчанию?
Мы не хотим, чтобы Mono был установлен по-умолчанию во всех дистрибутивах. Mono — это программная платформа, а значит он не должен быть установлен у всех пользователей. Ubuntu не поставляется по-умолчанию с Java, Scheme, Assemby, LISP и различными фреймворками, просто потому, что они не интересны большинству пользователей.
Мы хотим, чтобы по-умолчанию были хорошие программы. После загрузки Ubuntu, Kubuntu, Xubuntu или другого дистрибутива пользователь должен сказать «Ух ты, Свободное ПО настолько хорошо, что я больше не нуждаюсь в Windows». Все дистрибутивы СПО, стремящиеся обрести фанатов, должны выбирать лучшие приложения. В случае с Ubuntu, командой Desktop Team было принято решение включить в дистрибутив лучшее приложение для работы с заметками и лучший фото менеджер.
Desktop Team решила, что наилучшем приложением для работы с заметками является Tomboy. Приложение Tomboy гораздо функциональнее, чем апплеты «Sticky Notes» («Липучие заметки») как и от GNOME, так и от Windows Vista. Также Tomboy можно рассматривать как бесплатную замену проприетарному Microsoft OneNote стоимостью ?80. Единственное аналогичное по возможностям приложение является Zim «Desktop Wiki».
Zim — высококачественный продукт, но Desktop Team решила использовать Tomboy, поскольку это приложение удобнее для многих пользователей (и сейчас Tomboy используется как стандартное приложение в этом классе)
Также Desktop Team решила, что лучшим фото-менеджером является программа F-Spot. Приложение F-Spot можно сравнить по возможностям с проприетарными приложениями iPhoto компании Apple и Picasa от Google Inc. F-Spot нельзя сравнивать с приложениями типа файл-менеджер как gThumb, поскольку одной из ключевых особенностей является возможность прикреплять к фотографии важные метаданные, но gThumb работает для каждого каталога отдельно, а не для всех фото сразу, как F-Spot.
Пост размещенный в Linux Today
«Есть множество приложений и получше, которые можно включить в дистрибутив» — Пожалуйста, назовите такие приложения.
«проталкивание технологий Microsoft» — Помогите! Помогите! Нас угнетают! Нет, давайте серьёзно. Хорошая технология — это хорошая технология, а не изобретение велосипеда, который никому никогда не помогал. Среди участников Desktop Team нет профессионалов в Mono (большинство из них фанаты Python) и односторонних решений связанных с включением программ в дистрибутив не было, нету и не будет. Никто ничего не проталкивает! Ни один из пакетов связанных с Mono не был помечен как «важный» (Essential:yes).
«Включение этих програм оскверняет Ubuntu» — Демагогия. Microsoft — обычная корпорация, а не нечто сверхъестественное. Обвинение Microsoft в нечестивости и проталкивании продуктов делает им слишком много чести. Они — корпорация с огромным количеством глупых менеджеров и с редкими просветами в виде компетентных разработчиков. И ничего больше.
«Не могли бы вы сказать, почему Mono был удален из установочного дистрибутива Ubuntu?» — Предлагаю вашему вниманию цитату Томаса Джефферсона — «Насмешка — его единственное оружие против непонятных суждений. Мысли должны быть отчетливыми прежде чем разум сможет с ними что-либо сделать». Требования удалить Mono из дистрибутива Ubuntu беспричинны — в Ubuntu нету других пакетов, которые могли бы стать лучшей заменой, но сообщество требует удалить Mono. Это, проще говоря, «программный терроризм» — требование сменить политику и утверждение того что Desktop Team не свободны в выборе, основанном на собственной политике. Многие люди могут возразить в этом вопросе, но пока у них не будет адекватной замены для «приложений Mono», их выбор прост — делать Linux хуже и хуже, двигаясь к базовому набору приложений или всё-таки смириться с существованием Mono. Стоит заметить что такие люди — гораздо большая потеря нежели различные пользователи форумов, например, Mark Shuttleworth, который не один раз заявлял, что не разделяет страхов сообщества по поводу Mono. Я лично поддержал бы переход с Mono-приложений на другие, не основанные на Mono, но гораздо лучшими в своем классе.
«Просто включить его в стандартный репозиторий не приемлемо.» — Это абсолютно приемлемо, хотя это не единственное выдвинутое предложение — они варьируются от реклассификации Mono в non-Free репозиторий, до его полного удаления из Debian и Ubuntu. Свободные программы должны быть в стандартном репозитории, независимо от их реализации — но если реализация какого-то приложения является лучшей, то она должна быть включена по умолчанию.
«Неспособность фанатов Mono ответить на те простые вопросы меня немного беспокоит, такое впечатление, что есть куда более важные вопросы.» — Если вы обвиняете кого-то, тогда объясните суть обвинений. Если у вас есть конкретные обвинения к людям, которые не противостоят Mono, тогда напишите их или же не распространяйте мифы.
Движение против Mono
Есть люди, которые «за» какие-то вещи. Они за свободу, или за техническое превосходство, или за спортивную команду, или за что-то другое. Есть люди, которые «против». Они против некоторых политиков, или людей определенной национальности, или чего-то другого. Некоторые люди определяют себя сторонниками чего-то, а другие противниками. Mono вызывает огромный гнев среди второй группы; в частности, люди, которые используют GNU/Linux не потому, что они «за» что-либо, а потому, что они «против» Microsoft. Это можно хорошо разглядеть в использовании слов «Microshaft» или «Micro$oft» или других детских попытках определить «их» и «нас», чтобы высмеять «их». Для них все символично: если Mono — свободное ПО, то они «за», но если оно безвозмездно получено из рук Великого Сатаны, то это непростительно.
Большинство противников Mono не являются даже создателями сборок, а не то что разработчиками ПО. Они заявляют, что программисты (которые действительно тратят время на разработку СПО) должны использовать те платформы, которые нравятся им, а не самим разработчикам. Это другая причина, почему аргументы противников Mono не получают должного внимания — предположение о том, что кто-то может решать за разработчиков очень раздражает. СПО основывается на меритократии — более способные получают больше уважения. Пока противники Mono не будут вносить свой вклад в СПО они будут выглядеть чудаковато и их вопросы останутся без ответа.
В конце концов, не найдется ничего, что заставит исчезнуть споры вокруг Mono, до тех пор, пока расплывчатые угрозы юридической атаки распространяются и подпитываются некоторыми членами сообщества. Практически ничто не сможет успокоить тех, кто уже составил свое собственное мнение без какой-либо озабоченности о реальных основаниях или фактах. Аргументы против Mono основанные на реальности или фактах я считаю хорошими и приветствую их, но встречаться с ними мне приходилось очень редко. И даже если они приводятся, то тонущими в настолько густом соусе демагогии, страха, неуверенности и сомнения, что действительно важная информация попросту невидна.
Итак, я считаю эта статья то, что вы искали. Вы можете перепечатывать её или нет. Она создана как новая глава в ежедневных личных нападках на меня со стороны уж очень искушенных противников Mono.
Читайте также: