mpt-sln

mono-packaging-tools
 
https://github.com/ArsenShnurkov/mono-packaging-tools/tree/master/mpt-sln

and for the solution just use EnvDTE (MSDN documentation)

Вместо него есть такой класс:
https://github.com/ArsenShnurkov/slntools/blob/master/Main/CWDev.SLNTools.Core.dll/SolutionFile.cs
Там есть статический метод для загрузки файла в память
var sln = SolutionFile.FromFile(solutionFullPath);
При считывании создаётся коллекция проектов:
var projList = sln.Projects; // Это наследник от KeyedCollection -
KeyedCollection keeps your items in the order in which they are added (the first item added is at index 0 and the last added is at the last index). Dictionary does not (or at least it is never guaranteed to do so).
(источник - http://stackoverflow.com/questions/7566657/dictionary-or-keyedcollection)
но это не просто KeyedCollection, это класс-наследник ProjectHashList
имеет специальный метод Project FindByFullName(string projectFullName)
var proj = sln.Projects.FindByFullName("MyCsProjName");
И вот когда он найден, его можно удалить методом Remove из класса KeyedCollection
sln.Projects.Remove(proj)
после чего можно сохранить Solution методом Save
sln.Save();

http://stackoverflow.com/questions/22329677/remove-projects-from-a-solution-programmatically/39100945#39100945

Зависимости в ebuild-ах

Добавлен ли ебилд slntools в зависимости к mono-packaging-tools ?
пока не добавлен:
https://github.com/ArsenShnurkov/dotnet/blob/1e7571f7795f972011adb7924675afccdd6c8964/dev-util/mono-packaging-tools/mono-packaging-tools-0.1.2_p201608183.ebuild#L23-L26
это всё потому, что он не устанавливается в GAC. Нужно устанавливать в GAC, тестировать, бампать версию, потом добавлять зависимость, вписывать код парсинга параметров, вписывать код удаления проекта, снова тестировать, бампать другую версию.

slntools

Недоработки:
1) может не работать egacinstall при установке бинарных ебилдов (потому что gac может находиться в непривычной локации), а так он файлы в GAC запишет, наверное
2) версия .dll в GAC 1.1.1.0 не совпадает с версией пакета 1.1.3 (ну и ладно)
3) не устанавливается .pc-файл, а значит эта сборка не будет видна в monodevelop
4) наверное как-то можно ещё делать aot-компиляцию, но я не разбирался

Ошибка дублирования свойств

i am trying to remove csproj from sln, but library throws the exception
"CWDev.SLNTools.Core.SolutionFileException: Trying to add a new property line '$0.XmlFormattingPolicy=$16' when there is already a line with the same key and the value '$13' in the collection."
Why there are properties with the same ID
$0.XmlFormattingPolicy
$0.TextStylePolicy
is it safe to ignore these duplicates?

<ItemGroup>
    <ReferenceProject Include="../mpt-core/mpt-core.csproj" />
</ItemGroup>

mono --debug /var/calculate/remote/distfiles/egit-src/mono-packaging-tools.git/mpt-sln/bin/Debug/mpt-sln.exe --sln-file /var/tmp/portage/dev-util/monodevelop-6.1_p2016062206/work/monodevelop-6.1/Main.sln --remove-proj FSharpBinding
meld /var/tmp/portage/dev-util/monodevelop-6.1_p2016062206/work/monodevelop-6.1/Main.sln.bak /var/tmp/portage/dev-util/monodevelop-6.1_p2016062206/work/monodevelop-6.1/Main.sln


	/usr/bin/mpt-sln --sln-file "${S}/Main.sln" --remove-proj FSharpBinding || die
	/usr/bin/mpt-sln --sln-file "${S}/Main.sln" --remove-proj MonoDevelop.FSharp || die
	/usr/bin/mpt-sln --sln-file "${S}/Main.sln" --remove-proj MonoDevelop.FSharp.Shared || die
	/usr/bin/mpt-sln --sln-file "${S}/Main.sln" --remove-proj MonoDevelop.FSharp.Gui || die
	/usr/bin/mpt-sln --sln-file "${S}/Main.sln" --remove-proj MonoDevelop.FSharpInteractive.Service || die
	/usr/bin/mpt-sln --sln-file "${S}/Main.sln" --remove-proj MonoDevelop.FSharp.Tests || die
	/usr/bin/mpt-sln --sln-file "${S}/Main.sln" --remove-proj GitLib2Sharp || die || die


/var/tmp/portage/dev-dotnet/slntools-1.1.3_p201508170-r1/work/slntools-705869e96a2f0e401be03f8e8478df3e1f2b9373/Main/CWDev.SLNTools.Core.dll/PropertyLineHashList.cs:59
wget -c https://raw.githubusercontent.com/mono/monodevelop/master/main/Main.sln

Чтобы решить эту проблему по-хорошему, надо было:
1) Добавить свойство в коллекцию
2) в методе коллекции добавить проверку значания свойства, и в случае нахождения дубля не бросать исключение, если свойство установлено
3) получать значение этого свойства из командной строки (добавить параметр)
4) прописать в ebuild передачу этого значения

Тогда оно бы могло срабатывать без изменения .sln-файла.

Вместо этого я sed-ом вырезал все дублирующиеся строки (всё равно это сборка/билдовка, а не разработка и свойства для разработки при билдовке не понадобятся)