草庐IT

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

coder 2024-06-23 原文

在 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/

有关xml - .csproj 中文件的排序顺序的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  3. 亚特兰蒂斯的回声(中文版): chatGPT 的杰作 - 2

    英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古

  4. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  5. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  6. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  7. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

  8. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

  9. ruby-on-rails - 如何对对象数组进行排序? - 2

    我有一个对象如下:[{:id=>2,:fname=>"Ron",:lname=>"XXXXX",:photo=>"XXX"},{:id=>3,:fname=>"Dain",:lname=>"XXXX",:photo=>"XXXXXXX"},{:id=>1,:fname=>"Bob",:lname=>"XXXXXX",:photo=>"XXXX"}]我想按fname排序,不区分大小写,所以它会导致编号:1,3,2我该如何排序?我正在尝试:@people.sort!{|x,y|y[:fname]x[:fname]}但这没有任何效果。 最佳答案

  10. ruby - 以随机顺序将数组拆分为多个数组 - Ruby - 2

    我试图在每次运行时以随机顺序将一个名称数组拆分为多个数组。我知道如何拆分它们:name_array=["bob","john","rob","nate","nelly","michael"]array=name_array.each_slice(2).to_a=>[["bob","john"],["rob","nate"],["nelly","michael"]]但是,如果我希望它每次都以随机顺序吐出它们怎么办? 最佳答案 在做同样的事情之前,打乱数组。(Array#shuffle)name_array.shuffle.each_s

随机推荐