読者です 読者をやめる 読者になる 読者になる

SDD(Sleep-Driven Development)

睡眠の重要性!!睡眠の重要性!!

Xamarin Studioでクリーンしてもクリーンされない問題

Xamarin Studioを使っているとたまに全てクリーンしてもクリーンされない時があります。 これのせいで不自然にファイルが残りそれが原因でバグることも・・・

この回避手段は簡単でobjフォルダとbinフォルダを消せば大丈夫です(少なくとも私が遭遇したケースでは)。

ただ手動で消すためだけにXamarin Studioから離れるのはアレですしそもそもXamarin Studioがちゃんと消してくれれば問題ありません。ということで...

Addin作りました

クリーンをしたとき、強制的にbinとobjを消す拡張機能を作りました。

使い方は簡単。Githubから.dllを落としてきて

/Applications/Xamarin Studio.app/Contents/Resources/lib/monodevelop/AddIns (macOSの場合)

に突っ込んでやります。あとは起動してソリューションを開き、適当にファイルを開いて上部のメニューバーのビルドを選べばこんな感じに出てきます。

f:id:crocus7724:20160908142956p:plain

Forced Cleanが現在選択しているプロジェクトのみでForced Clean Allがソリューション内の(Xamarin Studioが認識している)全プロジェクト向けになります。英語おかしいのは気にしないでください

内部処理はこんな感じ

using System.IO;
using MonoDevelop.Core;
using MonoDevelop.Core.Execution;
using MonoDevelop.Projects;

namespace ForcedCleanAddin
{
    public class ProjectCleanService
    {
        public static void Clean(Project project, OutputProgressMonitor monitor = null)
        {
            monitor?.Log.WriteLine($"{project.Name}をクリーン...");

            project.Clean(ProgressMonitorService.CleanProgressMonitor, project.DefaultConfiguration.Selector);

            var path = project.BaseDirectory.FullPath;

            var binPath = Path.Combine(path, "bin");

            if (Directory.Exists(binPath))
            {
                Directory.Delete(binPath, true);
                monitor?.Log.WriteLine($"{binPath}を削除しました!");
            }

            var objPath = Path.Combine(path, "obj");

            if (Directory.Exists(objPath))
            {
                Directory.Delete(objPath, true);
                monitor?.Log.WriteLine($"{objPath}を削除しました!");
            }

            monitor?.Log.WriteLine("完了");
            monitor?.Log.WriteLine("");
        }
    }
}


ようするに最初にXamarin Studio標準のクリーンをしたあと.csprojと同じ階層にbinobjがあったら強制的に消します。慈悲はありません。
もっと柔軟に(現在選択されているビルド設定(DebugとかReleaseとか)だけ消すとか)できますがこれが一番シンプルなのでこれのみです。シンプルイズベスト。

実際にこの問題にぶち当たる人がどれだけいるかわかりませんが(私は今のところめったにない)、参考までに。

追記

この拡張のVisual Studioバージョンをid:nuitsjpさんが作ってくださいました!!

www.nuits.jp

流石です! これでMac(Xamarin Studio)とWindows(Visual Studio)両方でこの問題に直面しても大丈夫ですね(なお私のプラグインがちゃんと動くとは言ってない)