Share via


Indicizzatori specifici del formato MakePri.exe

In questo argomento vengono descritti gli indicizzatori specifici del formato usati dallo strumento MakePri.exe per generare l'indice delle risorse.

Nota

MakePri.exe viene installato quando si seleziona l'opzione Windows SDK for UWP Managed Apps durante l'installazione di Windows Software Development Kit. Viene installato nel percorso %WindowsSdkDir%bin\<WindowsTargetPlatformVersion>\x64\makepri.exe (nonché nelle cartelle denominate per le altre architetture). Ad esempio, C:\Program Files (x86)\Windows Kits\10\bin\10.0.17713.0\x64\makepri.exe.

MakePri.exe viene in genere usato con i comandi new, versioned, o resourcepack . Opzioni della riga di comando per MakePri.exe In questi casi indicizza i file di origine per generare un indice di risorse. MakePri.exe usa vari indicizzatori singoli per leggere diversi file di risorse di origine o contenitori per le risorse. L'indicizzatore più semplice è l'indicizzatore di cartelle, che indicizza il contenuto di una cartella, ad esempio .jpg o .png immagini.

È possibile identificare gli indicizzatori specifici del formato specificando <indexer-config> elementi all'interno di un elemento <index> del file di configurazione MakePri.exe. L'attributo type identifica l'indicizzatore specifico del formato utilizzato.

I contenitori di risorse incontrati durante l'indicizzazione di solito vengono indicizzati con il loro contenuto piuttosto che essere aggiunti all'indice stesso. Ad esempio, .resjson i file trovati dall'indicizzatore di cartelle possono essere ulteriormente indicizzati da un .resjson indicizzatore, nel qual caso il .resjson file stesso non compare nell'indice. Si noti che un <indexer-config>elemento per l'indicizzatore associato a tale contenitore deve essere incluso nel file di configurazione.

In genere, i qualificatori trovati in un'entità—contenitore, ad esempio una cartella o un file .resw — vengono applicate a tutte le risorse all'interno di essa, ad esempio i file all'interno della cartella o le stringhe all'interno del file .resw.

Cartella

L'indicizzatore di cartelle è identificato da untypeattributo di FOLDER. Indicizza il contenuto di una cartella e determina i qualificatori delle risorse dai nomi delle cartelle e dei file. L'elemento di configurazione è conforme allo schema seguente.

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="ExclusionTypeList">
        <xs:restriction base="xs:string">
            <xs:enumeration value="path"/>
            <xs:enumeration value="extension"/>
            <xs:enumeration value="name"/>
            <xs:enumeration value="tree"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="FolderExclusionType">
        <xs:attribute name="type" type="ExclusionTypeList" use="required"/>
        <xs:attribute name="value" type="xs:string" use="required"/>
        <xs:attribute name="doNotTraverse" type="xs:boolean" use="required"/>
        <xs:attribute name="doNotIndex" type="xs:boolean" use="required"/>
    </xs:complexType>
    <xs:simpleType name="IndexerConfigFolderType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((f|F)(o|O)(l|L)(d|D)(e|E)(r|R))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="exclude" type="FolderExclusionType" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="type" type="IndexerConfigFolderType" use="required"/>
            <xs:attribute name="foldernameAsQualifier" type="xs:boolean" use="required"/>
            <xs:attribute name="filenameAsQualifier" type="xs:boolean" use="required"/>
            <xs:attribute name="qualifierDelimiter" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

L'attributo qualifierDelimiter specifica il carattere dopo il quale i qualificatori vengono specificati in un nome file, ignorando l'estensione. Il valore predefinito è ".".

PRI

L'indicizzatore di cartelle è identificato da untypeattributo di PRI. Indicizza il contenuto di un file PRI. In genere viene usato durante l'indicizzazione della risorsa contenuta in un altro assembly, DLL, SDK o libreria di classi nel pri dell'app.

Tutti i nomi delle risorse, i qualificatori e i valori contenuti nel file PRI vengono gestiti direttamente nel nuovo file PRI. La mappa delle risorse di primo livello, tuttavia, non viene mantenuta nel PRI finale. Le mappe delle risorse vengono unite.

<xs:schema id="prifile" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigPriType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((p|P)(r|R)(i|I))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigPriType" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

PriInfo

L'indicizzatore di cartelle è identificato da untypeattributo di PRIINFO. Indicizza il contenuto di un file di dump dettagliato. È possibile produrre un file di dump dettagliato eseguendo makepri dump con /dt detailed l’opzione. L'elemento di configurazione è conforme allo schema seguente.

<xs:schema id="priinfo" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:simpleType name="IndexerConfigPriInfoType">
    <xs:restriction base="xs:string">
      <xs:pattern value="((p|P)(r|R)(i|I)(i|I)(n|N)(f|F)(o|O))"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="indexer-config">
    <xs:complexType>
      <xs:attribute name="type" type="IndexerConfigPriInfoType" use="required"/>
      <xs:attribute name="emitStrings" type="xs:boolean" use="optional"/>
      <xs:attribute name="emitPaths" type="xs:boolean" use="optional"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

Questo elemento di configurazione consente agli attributi facoltativi di configurare il comportamento dell'indicizzatore PriInfo. Il valore predefinito di emitStrings e emitPaths ètrue. Se emitStrings è true, i candidati delle risorse con l'attributo type impostato su "String" vengono inclusi nell'indice, altrimenti vengono esclusi. Se 'emitPaths' ètrue, i candidati delle risorse con l'attributo type impostato su "String" vengono inclusi nell'indice, altrimenti vengono esclusi.

Di seguito è riportato un esempio di configurazione che include i tipi di risorsa String ma ignora i tipi di risorsa Path.

<indexer-config type="priinfo" emitStrings="true" emitPaths="false" />

Per essere indicizzato, un file dump deve terminare con l'estensione .pri.xmle deve essere conforme allo schema seguente.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" >
  <xs:simpleType name="candidateType">
    <xs:restriction base="xs:string">
      <xs:pattern value="Path|String"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="scopeType">
    <xs:sequence>
      <xs:element name="ResourceMapSubtree" type="scopeType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="NamedResource" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Decision" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
                <xs:anyAttribute processContents="skip" />
              </xs:complexType>
            </xs:element>
            <xs:element name="Candidate" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="QualifierSet" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="Qualifier" minOccurs="0" maxOccurs="unbounded">
                          <xs:complexType>
                            <xs:attribute name="name" type="xs:string" use="required" />
                            <xs:attribute name="value" type="xs:string" use="required" />
                            <xs:attribute name="priority" type="xs:integer" use="required" />
                            <xs:attribute name="scoreAsDefault" type="xs:decimal" use="required" />
                            <xs:attribute name="index" type="xs:integer" use="required" />
                          </xs:complexType>
                        </xs:element>
                      </xs:sequence>
                      <xs:anyAttribute processContents="skip" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Value" type="xs:string"  minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
                <xs:attribute name="type" type="candidateType" use="required" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="name" use="required" type="xs:string" />
          <xs:anyAttribute processContents="skip" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" use="required" type="xs:string" />
    <xs:anyAttribute processContents="skip" />
  </xs:complexType>
  <xs:element name="PriInfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="PriHeader" >
          <xs:complexType>
            <xs:sequence>
              <xs:any minOccurs ="0" maxOccurs="unbounded" processContents="skip" />
            </xs:sequence>
            <xs:anyAttribute processContents="skip" />
          </xs:complexType>
        </xs:element>
        <xs:element name="QualifierInfo">
          <xs:complexType>
            <xs:sequence>
              <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="ResourceMap">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="VersionInfo">
                <xs:complexType>
                  <xs:anyAttribute processContents="skip" />
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" maxOccurs="unbounded" name="ResourceMapSubtree" type="scopeType" />
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="required" />
            <xs:anyAttribute processContents="skip" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

MakePri.exe supporta i tipi di dump 'Basic', 'Detailed', 'Schema' e 'Summary'. Per configurare MakePri.exe per generare il tipo di dump che l'indicizzatore PriInfo può leggere, includere "/DumpType Detailed" quando si usa il comando dump.

Diversi elementi del file .pri.xml vengono ignorati da MakePri.exe. Questi elementi vengono calcolati durante l'indicizzazione o vengono specificati nel file di configurazione MakePri.exe. Tutti i nomi delle risorse, i qualificatori e i valori contenuti nel file PRI vengono gestiti direttamente nel nuovo file PRI. La mappa delle risorse di primo livello, tuttavia, non viene mantenuta nel PRI finale. Le mappe delle risorse vengono unite come parte dell'indicizzazione.

Questo è un esempio di risorsa di tipo String valida da un file dump.

<NamedResource name="SampleString " index="96" uri="ms-resource://SampleApp/resources/SampleString ">
  <Decision index="2">
    <QualifierSet index="1">
      <Qualifier name="Language" value="EN-US" priority="900" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
  </Decision>
  <Candidate type="String">
    <QualifierSet index="1">
      <Qualifier name="Language" value="EN-US" priority="900" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <Value>A Sample String Value</Value>
  </Candidate>
</NamedResource>

Questo è un esempio di risorsa di tipo Path valida con due candidati da un file di dump.

<NamedResource name="Sample.png" index="77" uri="ms-resource://SampleApp/Files/Images/Sample.png">
  <Decision index="2">
    <QualifierSet index="1">
      <Qualifier name="Scale" value="180" priority="500" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <QualifierSet index="2">
      <Qualifier name="Scale" value="140" priority="500" scoreAsDefault="0.7" index="2"/>
    </QualifierSet>
  </Decision>
  <Candidate type="Path">
    <QualifierSet index="1">
      <Qualifier name="Scale" value="180" priority="500" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <Value>Images\Sample.scale-180.png</Value>
  </Candidate>
  <Candidate type="Path">
    <QualifierSet index="2">
      <Qualifier name="Scale" value="140" priority="500" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <Value>Images\Sample.scale-140.png</Value>
  </Candidate>
</NamedResource>

ResFiles

L'indicizzatore di cartelle è identificato da untypeattributo di PRIINFO. Indicizza il contenuto di un file .resfiles. L'elemento di configurazione è conforme allo schema seguente.

<xs:schema id="resx" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigResFilesType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((r|R)(e|E)(s|S)(f|F)(i|I)(l|L)(e|E)(s|S))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigResFilesType" use="required"/>
            <xs:attribute name="qualifierDelimiter" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Un file .resfiles è un file di testo contenente un elenco flat di percorsi di file. Un file .resfiles può contenere commenti "//". Ecco un esempio.

Strings\component1\fr\elements.resjson
Images\logo.scale-100.png
Images\logo.scale-140.png
Images\logo.scale-180.png

ResJSON

L'indicizzatore di cartelle è identificato da untypeattributo di PRIINFO. Indicizza il contenuto di un file di .resjson, ovvero un file di risorse stringa. L'elemento di configurazione è conforme allo schema seguente.

<xs:schema id="resjson" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigResJsonType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((r|R)(e|E)(s|S)(j|J)(s|S)(o|O)(n|N))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigResJsonType" use="required"/>
            <xs:attribute name="initialPath" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Un file .resjson contiene testo JSON (vedere Il tipo di supporto application/json per JSON (JavaScript Object Notation)). Il file deve contenere un singolo oggetto JSON con proprietà gerarchica. Ogni proprietà deve essere un altro oggetto JSON o un valore stringa.

Le proprietà JSON con nomi che iniziano con un carattere di sottolineatura ("_") non vengono compilate nel file PRI finale, ma vengono mantenute nel file di log.

Il file può anche contenere commenti "//" che vengono ignorati durante l'analisi.

L'attributo initialPath inserisce tutte le risorse in questo percorso iniziale anteponendo il nome della risorsa. In genere questa operazione viene usata durante l'indicizzazione delle risorse della libreria di classi. Il valore predefinito è blank.

ResW

L'indicizzatore di cartelle è identificato da untypeattributo di PRI. Indicizza il contenuto di un file di .resw, ovvero un file di risorse stringa. L'elemento di configurazione è conforme allo schema seguente.

<xs:schema id="resw" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigResxType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((r|R)(e|E)(s|S)(w|W))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigResxType" use="required"/>
            <xs:attribute name="convertDotsToSlashes" type="xs:boolean" use="required"/>
            <xs:attribute name="initialPath" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Un file.resw è un file XML conforme al seguente schema.

  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>

L'attributo convertDotsToSlashes converte tutti i caratteri punto (".") presenti nei nomi delle risorse (attributi del nome dell'elemento dati) in una barra "/", tranne quando i caratteri punto sono compresi tra "[" e "]".

L'attributo initialPath inserisce tutte le risorse in questo percorso iniziale anteponendo il nome della risorsa. In genere questa operazione viene usata durante l'indicizzazione delle risorse della libreria di classi. Il valore predefinito è blank.