gpt4 book ai didi

xml - .csproj 中文件的排序顺序

转载 作者:数据小太阳 更新时间:2023-10-29 01:38:22 27 4
gpt4 key购买 nike

在 Visual Studio csproj 中,要编译的文件是这样引用的:

<ItemGroup>
<Compile Include="C\Something.cs">
<Compile Include="B\SomethingElse.cs">
<Compile Include="A\YetSomethingElse.cs">
</ItemGroup>

在我看来顺序是随机的(至少我看不出顺序原则)。

有几次在修复合并冲突时,我错误地添加了一个文件两次(因为有很多文件,而合并冲突行的文件已经在列表中的另一个位置)。如果有一种方法可以按字母顺序对 Compile Included 文件进行排序,这将很容易避免。

这是否已经可行(或者我必须自己编写脚本)?我需要注意任何副作用吗?

最佳答案

我刚刚遇到这个问题,因为我们团队的更多成员提交时没有他们的解决方案文件,我们独立地将文件添加到解决方案中,他们迟来提交他们的解决方案文件并且 Team Foundation Server/Visual Studio Online 完全无法获得合并权。

有些文件添加了两次,有些根本没有添加,每个人的文件顺序都不同 - 合并 hell 。

有点解决了无法使用以下 C# 对解决方案中的内容文件进行排序的问题,我在很棒的 LinqPad 中执行它。

var documentsLocation = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);

var unsortedFilePath = Path.Combine(documentsLocation.ToString(), "UnsortedConfigItems.xml");

var unsortedFile = new FileInfo(unsortedFilePath);

if (!unsortedFile.Exists) {
throw new FileNotFoundException(string.Format("The unsorted file could not be found at path {0}", unsortedFilePath));
}

var sortedFilePath = Path.Combine(documentsLocation, "SortedConfigItems.xml");

const string RootNodeName = "ItemGroup";

const string IncludeAttributeName = "Include";

var contentElementNames = new [] { "Compile", "Content", "None" };

var xmlFile = XDocument.Load(unsortedFile.FullName);

if (xmlFile == null || xmlFile.Root == null || xmlFile.Root.Name != RootNodeName)
{
Console.WriteLine("Invalid file or unexpected file schema");
return;
}

var allElements = xmlFile.Root.Elements();

var contentElements = new List<XElement>();

foreach(var elementName in contentElementNames) {
contentElements.AddRange(xmlFile.Root.Elements(elementName));
}

var elementsWithInclude = contentElements.Where(ce => ce.Attribute(IncludeAttributeName) != null && !string.IsNullOrWhiteSpace(ce.Attribute(IncludeAttributeName).Value));

if (!elementsWithInclude.Any())
{
Console.WriteLine("No content elements to sort");
return;
}

contentElements = null; // Make candidate for garbage collection

var uniqueElements = new List<XElement>(elementsWithInclude.Count());

foreach (var element in elementsWithInclude)
{
if (!uniqueElements.Any(e => e.Attribute(IncludeAttributeName).Value == element.Attribute(IncludeAttributeName).Value))
{
uniqueElements.Add(element);
}
}

var sortedUniqueElements = uniqueElements.OrderBy(ue => ue.Name.LocalName).ThenBy(ue => ue.Attribute(IncludeAttributeName).Value).ToList();

var remainingElements = new List<XElement>();

foreach (var element in allElements.Where(ae => !elementsWithInclude.Contains(ae))) { // This uses elements with include and not sorted unique to avoid re-adding filtered files
remainingElements.Add(element);
}

var sortedFile = new XDocument();
sortedFile.AddFirst(new XElement(RootNodeName));

sortedUniqueElements.ForEach(sue => sortedFile.Root.Add(sue));

remainingElements.ForEach(re => sortedFile.Root.Add(re));

sortedFile.Save(sortedFilePath);

我确信它可以稍微压缩并变得更优雅,但它为我们完成了工作。

完整性步骤-

  1. 确保您的项目文件已备份,无论是在源代码管理中还是在本地。

  2. 右键单击解决方案资源管理器中的项目并选择“卸载项目”(如果未显示项目文件并且解决方案中只有一个项目,则在 Visual Studio 选项中选择“始终显示解决方案” ).

  3. 项目图标应该已经改变,它将被列为“(不可用)”。再次右键单击并选择“编辑ProjectName.csproj”

  4. 找到包含内容引用的 ItemGroup 节点,然后剪切或复制并粘贴到一个新文件中(NotePad++ 非常适合此操作,但请使用您选择的编辑器)并保存在 XmlPathName 的位置。确保“ItemGroup”节点是新 XML 文档的根节点。

  5. 如果需要,更改 SortedPathName 中的路径,并确保您的 Windows 用户帐户对该位置具有写入权限。

  6. 在 LinqPad 中运行上述 C#(或将其分支并创建您自己的控制台应用程序/Powershell 脚本)。

  7. 检查输出文件的内容以确保其看起来正确(行数和格式大体一致),并在可能的情况下验证为有效的 XML(Notepad++ 中的 XML 工具非常适合此操作)。

  8. 将输出文件的内容复制回您的解决方案文件,替换原始 ItemGroup 节点

  9. 关闭 csproj 文件,右键单击解决方案资源管理器中的项目并选择“重新加载项目”。

  10. 如果该项目是您的启动项目,您可能需要再次右键单击并选择“设置为启动项目”

  11. 尝试构建

关于xml - .csproj 中文件的排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20563017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com