ディレクトリをスキャンし、ソリューション ファイルと .csproj ファイルにモニカを追加する、同僚の 1 人が作成したツールを使用しています。
= "Some category" を持つファイルをテキスト ファイルからスキャンして、.sln ファイルと .csproj ファイルにモニカーを設定しています。
問題は、プロジェクト リストに約 700 のプロジェクトがあることです。それに応じてソリューションとプロジェクトの場所を変更していますが、ソリューションが依存している一部のプロジェクトにはソリューション ファイルと同じモニカーがないため、Visual Studio はプロジェクト ファイルの読み込みエラーをスローします。
これを修正するには、テキスト ファイルのモニカーを修正してツールを再度実行する必要がありますが、ツールは変更されたファイルだけでなく、すべてをスキャンします。
結果をキャッシュして、変更内容をスキャンする方法はありますか? 間違っていたプロジェクトの名前を修正するためにツールを再実行すると、多くの時間を節約できると思います。.csproj ファイルをマークする方法を次に示します。
internal static void MarkAllProjects()
{
const string assemblyOutputTypeForLibrary = "library";
Dictionary<string, string> projectEntries = new Dictionary<string, string>();
using (var stream = new System.IO.StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ProjectMarker.ProjectList.txt")))
{
while (stream.EndOfStream == false)
{
string[] projectEntry = stream.ReadLine().Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
if (projectEntry.Count() == 2 && projectEntries.ContainsKey(projectEntry[0]) == false)
{
projectEntries.Add(projectEntry[0], projectEntry[1]);
}
}
}
Parallel.ForEach<KeyValuePair<string, string>>(projectEntries, projectEntry =>
{
var files = Directory.GetFiles(sourceDirectoryRoot, projectEntry.Key, SearchOption.AllDirectories);
Parallel.ForEach<string>(files, file =>
{
XDocument projectFileAsXml = XDocument.Parse(File.ReadAllText(file, Encoding.UTF8));
string markerElementIdentifier = string.Empty;
string postBuildEventIdentifier = string.Empty;
string assemblyNameIdentifier = string.Empty;
string propertyGroupIdentifier = string.Empty;
string assemblyOutputType = string.Empty;
string projectOutputType = string.Empty;
if (projectFileAsXml.Root.GetDefaultNamespace() != null && string.IsNullOrWhiteSpace(projectFileAsXml.Root.GetDefaultNamespace().NamespaceName) == false)
{
markerElementIdentifier = string.Concat("{", projectFileAsXml.Root.GetDefaultNamespace(), "}", "ItemDefinitionGroup");
postBuildEventIdentifier = string.Concat("{", projectFileAsXml.Root.GetDefaultNamespace(), "}", "PostBuildEvent");
assemblyNameIdentifier = string.Concat("{", projectFileAsXml.Root.GetDefaultNamespace(), "}", "AssemblyName");
propertyGroupIdentifier = string.Concat("{", projectFileAsXml.Root.GetDefaultNamespace(), "}", "PropertyGroup");
assemblyOutputType = string.Concat("{", projectFileAsXml.Root.GetDefaultNamespace(), "}", "OutputType");
projectOutputType = string.Concat("{", projectFileAsXml.Root.GetDefaultNamespace(), "}", "ProjectTypeGuids");
}
else
{
markerElementIdentifier = "ItemDefinitionGroup";
postBuildEventIdentifier = "PostBuildEvent";
assemblyNameIdentifier = "AssemblyName";
propertyGroupIdentifier = "PropertyGroup";
assemblyOutputType = "OutputType";
projectOutputType = "ProjectTypeGuids";
}
if (projectFileAsXml.Root.Element(markerElementIdentifier) == null
|| (projectFileAsXml.Root.Element(markerElementIdentifier) != null
&& projectFileAsXml.Root.Element(markerElementIdentifier).Attribute("Label") == null))
{
projectFileAsXml.Root.Add(new XElement(markerElementIdentifier, new XAttribute("Label", projectEntry.Value)));
if (projectFileAsXml.Root.Descendants(assemblyOutputType).FirstOrDefault() != null
&& projectFileAsXml.Root.Descendants(assemblyOutputType).First().Value.ToLower() == assemblyOutputTypeForLibrary
&& projectFileAsXml.Root.Descendants(assemblyNameIdentifier).FirstOrDefault() != null
&& projectFileAsXml.Root.Descendants(assemblyNameIdentifier).First().Value.Contains("Test") == false
&& (projectFileAsXml.Root.Descendants(projectOutputType).FirstOrDefault() == null
|| projectTypeGuidsToBeExcluded.Exists(item => projectFileAsXml.Root.Descendants(projectOutputType).First().Value.ToUpper().Contains(item)) == false))
{
string nugetPublishDirectory = string.Concat(targetDirectoryRoot, "\\NuGetPublishings\\", projectEntry.Value, "\\", projectFileAsXml.Root.Descendants(assemblyNameIdentifier).First().Value, "\\lib");
Directory.CreateDirectory(nugetPublishDirectory);
if (projectFileAsXml.Root.Descendants(postBuildEventIdentifier).FirstOrDefault() == null)
{
projectFileAsXml.Root.Add(new XElement(propertyGroupIdentifier,
new XElement(postBuildEventIdentifier,
string.Concat("copy \"$(TargetDir)$(TargetFileName)\" ", "\"$(SolutionDir)..\\NuGetPublishings\\", projectEntry.Value, "\\$(ProjectName)\\lib\\$(TargetFileName)\""))));
}
else
{
projectFileAsXml.Root.Descendants(postBuildEventIdentifier).First().Value
+= Environment.NewLine + string.Concat("copy \"$(TargetDir)$(TargetFileName)\" ", "\"$(SolutionDir)..\\NuGetPublishings\\", projectEntry.Value, "\\$(ProjectName)\\lib\\$(TargetFileName)\"");
}
}
projectFileAsXml.Save(file);
}
});
});
さらに明確にする必要がある場合はお知らせください。
どうもありがとう!