Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting WiX Heat:组件的排序顺序_Sorting_Wix - Fatal编程技术网

Sorting WiX Heat:组件的排序顺序

Sorting WiX Heat:组件的排序顺序,sorting,wix,Sorting,Wix,我希望能够将由heat生成的WXS文件与以前的版本进行比较,以便验证更改 但我找不到组件顺序背后的任何逻辑。生成的组件既不按Id也不按目录名排序。当我重新生成WXS文件并且添加了一些文件时,顺序总是完全不同的,这使得比较非常困难 有没有办法控制分拣顺序?如果组件按内部文件节点的源进行排序,则理想情况是。但任何固定的秩序对我来说都足够了 例如,对于下面的示例,如果组件按文件源排序,那就太好了。即Log4Net之前的AutoMapper <Component Id="cmpB83..." Di

我希望能够将由heat生成的WXS文件与以前的版本进行比较,以便验证更改

但我找不到组件顺序背后的任何逻辑。生成的组件既不按Id也不按目录名排序。当我重新生成WXS文件并且添加了一些文件时,顺序总是完全不同的,这使得比较非常困难

有没有办法控制分拣顺序?如果组件按内部文件节点的源进行排序,则理想情况是。但任何固定的秩序对我来说都足够了

例如,对于下面的示例,如果组件按文件源排序,那就太好了。即Log4Net之前的AutoMapper

<Component Id="cmpB83..." Directory="DIR.MYDIR" Guid="{2A49...}">
    <File Id="filA272..." KeyPath="yes" source="$(var.MYVAR)\AutoMapper.xml" />
</Component>
<Component Id="cmp445..." Directory="DIR.MYDIR" Guid="{1C34...}">
    <File Id="filB356..." KeyPath="yes" source="$(var.MYVAR)\Log4Net.xml" />
</Component>

我使用以下参数开始加热:

heat.exe dir MYDIR-gg-dr dir.MYDIR-srd-sreg-ke-cg compGroup.MYGROUP-var var.MYVAR-out..\MYOUTPUT.wxs


我使用WiX 3.11。

由于两年来一直没有答案,我将展示我所做的:

我使用此代码通过生成文件中的“源”重新订购组件,并将其存储到副本中:

XDocument xdoc = XDocument.Load(filename);

XElement componentsFragment = xdoc.Root.Elements().ElementAt(1);
XElement componentGroup = componentsFragment.Elements().ElementAt(0);
List<XElement> components = componentGroup.Elements().ToList();
List<XElement> sortedComponents = components.OrderBy(one =>   one.Elements().ElementAt(0).Attribute("Source").Value).ToList();

componentGroup.RemoveNodes();
foreach (XElement component in sortedComponents)
{
  componentGroup.Add(component);
}

xdoc.Save(resultFilename);
XDocument xdoc=XDocument.Load(文件名);
XElement componentsFragment=xdoc.Root.Elements().ElementAt(1);
XElement componentGroup=componentsFragment.Elements().ElementAt(0);
List components=componentGroup.Elements().ToList();
List sortedComponents=components.OrderBy(one=>one.Elements().ElementAt(0).Attribute(“Source”).Value).ToList();
componentGroup.RemoveNodes();
foreach(sortedComponents中的XElement组件)
{
componentGroup.Add(组件);
}
xdoc.Save(resultFilename);

由于两年来一直没有答案,我将展示我所做的:

我使用此代码通过生成文件中的“源”重新订购组件,并将其存储到副本中:

XDocument xdoc = XDocument.Load(filename);

XElement componentsFragment = xdoc.Root.Elements().ElementAt(1);
XElement componentGroup = componentsFragment.Elements().ElementAt(0);
List<XElement> components = componentGroup.Elements().ToList();
List<XElement> sortedComponents = components.OrderBy(one =>   one.Elements().ElementAt(0).Attribute("Source").Value).ToList();

componentGroup.RemoveNodes();
foreach (XElement component in sortedComponents)
{
  componentGroup.Add(component);
}

xdoc.Save(resultFilename);
XDocument xdoc=XDocument.Load(文件名);
XElement componentsFragment=xdoc.Root.Elements().ElementAt(1);
XElement componentGroup=componentsFragment.Elements().ElementAt(0);
List components=componentGroup.Elements().ToList();
List sortedComponents=components.OrderBy(one=>one.Elements().ElementAt(0).Attribute(“Source”).Value).ToList();
componentGroup.RemoveNodes();
foreach(sortedComponents中的XElement组件)
{
componentGroup.Add(组件);
}
xdoc.Save(resultFilename);

虽然XML元素确实有顺序,但正如您所建议的,我认为顺序对WIX或Windows installer并不重要。你可以根据每一次的热度对它们进行分类。实现这一点的一种方法是将XSLT传递给适用于您的heat。(我希望有人能给出一个有意义的答案。)虽然XML元素确实有顺序,正如您所说,我认为顺序对WIX或Windows installer并不重要。你可以根据每一次的热度对它们进行分类。实现这一点的一种方法是将XSLT传递给适用于您的heat。(我希望有人能给出一个答案,让这个问题变得毫无意义。)