Partager via


Cet article a fait l'objet d'une traduction automatique.

Notions de base « Oslo »

Création d'applications en fonction de métadonnées avec la plate-forme “ Oslo ”

Chris Sells

Cet article est basé sur une version préliminaire de la plate-forme « Oslo ». Toutes les informations sont sujets à modification.

Cet article présente :

  • ” Oslo ” et les métadonnées
  • MGraph et MSchema
  • Scripts SQL, Empaquetage et déploiement
  • Visual Studio Intégration
Cet article utilise les technologies suivantes :
” Oslo ”, SQL Server 2008

Contenu

Les métadonnées
Créer sur « Oslo »
MGraph et MSchema
Génération SQL
Empaquetage et déploiement
Visual Studio Integration
Exemple de code

une application basée sur Microsoft .NET Framework est généralement définie par un ensemble de code compilé et un ensemble de ressources associées. Par exemple, une application ASP.NET est définie par le code compilé (assemblys) qui fournissent la logique de votre site Web et les fichiers ressources (fichiers .aspx) qui définissent les pages elles-mêmes. Le code est exécuté par le processeur (après compilation) et les pages sont interprétées par le runtime ASP.NET. De même, Windows Workflow Foundation (WF) vous permet de définir des comportements comme une série d'activités configurées, tout qui est seulement les données soient interprétées par le runtime WF.

Combiner ASP.NET sur le côté de l'interface utilisateur et le pare-feu Windows sur le comportement côté et vous pouvez commencer à imaginer la création d'applications ensemble comme presque totalement données, à l'aide uniquement à renseigner comportements ne pas via l'exécution de code.

Les données que lecteurs ces exécution sont parfois appelées métadonnées. Les métadonnées peuvent définir que les données qui décrit une application, par exemple, comment une page d'accueil est affichée ou comment fonctionne le flux de travail d'achat. Vos données d'application représente l'état de l'exécution d'une application, telle que les trois placer dans son panier sur votre site Web ou son adresse de livraison de votre workflow extraction.

Pour fournir un ensemble commun d'outils pour la définition de métadonnées afin qu'il peut être stocké dans un endroit qui fournit le même ensemble de fonctionnalités que les données d'application normal, Microsoft crée « Oslo », une plate-forme pour la création d'applications orientées données. " Oslo » est composé de trois éléments : une gamme de langages collectivement appelés "M", un outil de manipulation des données de visual appelée « quartier », et une banque de données appelé le référentiel.

Dans cet article, je présente à certaines des concepts de la plate-forme « Oslo ». J'AI également présente les outils et technologies que vous devez employer pour placer ces concepts dans les exercices pratiques. En particulier, j'aborderai la « Oslo » permet générer des applications pilotées par le de métadonnées, à l'aide les outils MSchema et MGraph et les principes fondamentaux de la définition de types et de valeurs dans les « M » ainsi que de les déployer dans le référentiel.

“ Olso ”: un nouveau moyen d'implémentation une idée ancienne

L'idée d'orientées données infrastructures est rien de nouveau. Prenons un autre exemple : Windows Presentation Foundation (WPF). La manière dont la plupart des applications WPF sont écrites, grande partie de l'application est composée de XAML, qui est chargé au moment de l'exécution et interprétée par l'analyseur XAML. Voici les métadonnées qui détermine la définition d'une application WPF. Vous pouvez même modifier la définition d'une application WPF en chargement ou générer XAML à l'exécution le développeur n'a pas connaissance lors de la compilation.

Toutefois, il n'y a rien magique sur le code XAML (compilé dans un formulaire appelé BAML) est fourni dans une ressource dont le code d'application, il a aussi facilement pu être chargé dans un fichier séparé ou même dans une base de données relationnelle. S'il a été chargé dans une base de données, le chargeur de WPF s'exécuter des requêtes SQL pour accéder aux définitions d'applications au lieu de charger des ressources, mais l'utilisateur serait sinon a pas connaissance de la différence. Et si une définition d'application serait chargés à partir d'une base de données, tous les que données peuvent être mis à jour de manière centralisée, donnant les développeurs de l'application la possibilité de propager les modifications sans re-deploying l'application pour chaque client que vous souhaitez exécuter. Cela est, en fait, la tonnerre fonctionnalité du Web et un important de pilote vers pour tous les types d'applications, si elles s'exécuter dans le navigateur ou non.

À présent, dès que vous chargez une application dans un emplacement central, vous allez souhaitez multi-utilisateur fonctionnalités telles que la réplication, securit, y et contrôle de version. Vous souhaiterez également prise en charge pour les utilisateurs déconnectés et pour les utilisateurs de différents paramètres régionaux dans le monde entier.

Et enfin, les définitions d'applications peuvent être utilisées pour conduire plus qu'une instance d'une application. Pouvoir être utilisées en temps de développement pour vérifier si les parties particuliers d'une application exécutez conformément aux spécifications. Pouvoir être utilisées lors de l'exécution pour afficher ce que parties obtenez Utilisation ou avoir un problème. Pouvoir être utilisées aux problèmes de balise pour que les développeurs peuvent voir spécifiquement est d'où les problèmes. Des métadonnées d'une application fournit la puissance de requête d'un modernes, indexée connecté répliqué, sécurisé, version, localisées, base de données hors connexion-capable.

Et c'est essentiellement ce que « Oslo » concerne toutes les, l'utilisation de la puissance de SQL Server pour stocker des métadonnées d'une application. À l'aide des métadonnées sur lecteur que le comportement d'une application a été utilisé dans Windows depuis au moins nous avons commencé balises binaires à l'aide le bit de console pour obtenir une fenêtre de console sans avoir à écrire le code. " Oslo" consiste simplement à Officialisation généralisant les métadonnées de votre application et fournissant l'alimentation et des outils utilisés pour les données de vos applications.

Les métadonnées

Ce qui rend métadonnées distincts de vos données d'application est que les métadonnées pour une application rarement change, c'est généralement quelque chose que même en le startups wildest modifie uniquement une fois par jour lorsqu'une nouvelle version d'un site Web est placée en. En revanche, les données d'une application souvent changent tout à fait beaucoup, c'est ce que les utilisateurs manipulez toute la journée, chaque jour sur un site Web courant.

Tirant ce supplémentaires, les métadonnées qui décrivent le traitement que j'utilise pour type de cet article n'a pas changé depuis 2007 lorsqu'il a été publiée, mais les données a modifié des milliers de fois que je taper des caractères et déplacez la souris pour manipuler les documents je travaille aujourd'hui sur. En fait, métadonnées sont écrit donc rarement qui en nombreux cas, qu'il est distribué dans les packages en lecture seule, comme les définitions de classe dans un assembly .NET ou les fichiers XAML précompilés incorporés en tant que ressources dans un assembly. Étant donné que les développeurs écrivent souvent leurs applications en fonction de la nature statique de métadonnées, tels que les gestionnaires d'événements pour un bouton défini dans une page ASP.NET, modification d'une application métadonnées seldomly n'est pas une mauvaise chose.

Toutefois, la chose qui est type d'incorrecte sur notre infrastructure de métadonnées actuelle est que les outils pour définir et lecture de métadonnées sont donc différents de ceux que vous utiliseriez pour des données d'application.

Je peut développer une application pour lire et écrire des données via une base de données relationnelle, me donner un ensemble puissant d'outils pour les éléments comme interrogation, sécurisation, réplication et contrôle de version. Mais si je souhaite requête de métadonnées de .NET Framework, j'être beaucoup plus limité d'outils : l'API de réflexion, en gros.

En outre, les outils .NET Framework pour la manipulation des métadonnées sont très différents à partir les outils me permet de déchiffrer ouvrir les métadonnées SQL. Si je souhaite requête entre une application données et métadonnées, requête sur les flux de travail actuellement en cours d'exécution avec les définitions de ces flux de travail, j'ai créer mes propres outils car les sources de données sont différents : SQL et fichiers XOML (extensible objet Markup Language).

Créer sur « Oslo »

Il y a plusieurs choses que vous pouvez créer avec Oslo. Lorsque nous parlerons interne scénarios, souvent la discussion revient à créer des applications qui impliquent des données. Toutefois, vous remarquerez que dans l'ensemble des choses que je répertorié comme partie "Olso » je n'a pas mentionne toute exécution. En fait, fichiers .aspx ne sont pas trop utiles sans ASP.NET et fichiers XOML sans WF serait peu attractives.

Il existe plusieurs d'exécution et services de développement qui tirer parti D'oslo. Elles comprennent des langages propres au domaine (DSL) et concepteurs quartier pour les applications Web ASP.NET, services Web WCF et bases de données EF. Vous serez en mesure de charger des données dans l'espace de stockage et de lecteur ces exécution.

Le référentiel « Oslo » est adapté aux applications où les développeurs entreprise ont intégré leurs propres éléments comme de référentiel pour le stockage des métadonnées. Par exemple, « Oslo » serait une bonne plate-forme pour un référentiel d'informations de configuration ordinateur qui permettrait personnel d'exploitation interroger et comprendre les configurations d'ordinateur facilement ou de la même façon, un référentiel de procédures opérationnelles et de scripts. Pour les développeurs, car l'espace de stockage fournit une banque unifiée et queriable pour les métadonnées, il serait possible répondre aux questions telles que "quelles applications et les classes implémentent une méthode certaine? » et « va modification de cette méthode affecter les performances » ?

Une autre zone potentielle pour utilisation « Oslo » peut être pour comprendre les applications distribuées. DIACRITIQUE Profile, couverture du code, charge de test et données architecturales dans l'espace de stockage permettent aux développeurs, par exemple, résoudre rapidement les problèmes de performances en naviguant sur le composant distribué connexe, examiner les paramètres de différents paramètres de configuration et Affichage détails d'implémentation appropriée. Elle permet en outre, pour le développement d'outils analyse statique automatiquement état défauts.

Une zone qui particulièrement tickles mon complète est déploiement et l'installation. En définissant des packages d'installation dans une langue propres au domaine et les charger dans l'espace de stockage, un développeur renvoie les services de langage de tout langage moderne avec outils de requête de la conformité à ces stratégies. Par exemple, vous pouvez requête Si paramétrages sont protégés par les accords de licence appropriée.

Voici un exemple : le site Microsoft téléchargement Centre Web fournit des téléchargements hautement évolutive pour les clients. Pour les fichiers être hébergés sur ce site, ils doivent être un fichier Microsoft Installer (MSI) et marquées avec un contrat de licence utilisateur final (CLUF). Après avoir effectué cette sur heures moitié un avoir l'utilisation de l'interface utilisateur dans Visual Studio, je cause recherchez une solution automatisée et trouvé dans Windows Installer XML (WiX), qui vous permettent de me XML permet de définir le paramétrage et compiler dans un fichier MSI.

la figure 1 illustre un exemple de code XML WiX. À le œil untrained, cela ne peut pas apparaître comme une amélioration sur exécute une interface graphique utilisateur, mais une fois que vous avez terminé les mouvements de souris 27 même quelques heures, le programmeur vous prend le relais.

La figure 1 code XML de WiX pour créer un fichier MSI

<?xml version='1.0' encoding='Windows-1252'?>
<Wix xmlns="https://schemas.microsoft.com/wix/2006/wi">
  <Product Name="SuperNotepad" Id="d65d2125-560b-4ba9-bdca-3b3bcd3f7b70"
           UpgradeCode="ac5c9dac-b3f0-469a-8f1a-02c2566eee33" 
           Language="1033" Codepage="1252"
           Version="1.0.0.0" Manufacturer="SuperNotepad Corp.">
    <Package Description="A really super pad for notes" 
             Manufacturer="SuperNotepad Corp."
             InstallerVersion="200" Languages="1033" Compressed="yes" />
    <Media Id="1" Cabinet="setup.cab" EmbedCab="yes" />
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder" Name="ProgramFilesFolder">
        <Directory Id="Directory3" Name="SuperNotepad Corp.">
          <Directory Id="INSTALLDIR" Name="Better NotePad">
            <Component Id="Component1" 
                       Guid="f7554ac8-32cd-44fb-bf85-0559c7d2e15c">
              <File Id="File1" Name="Manual.txt"
                    Source="C:\temp\SuperNotepad\Files\manual.txt" />
              <File Id="File2" Name="dependency.dll"
                    Source="C:\temp\SuperNotepad\Files\dependency.dll" />
              <File Id="File3" Name="BetterNotePad.exe"
                    Source="C:\temp\SuperNotepad\Files\notepad.exe" />
            </Component>
          </Directory>
        </Directory>
      </Directory>
    </Directory>
    <Feature Id="Feature1" Level="1">
      <ComponentRef Id="Component1" />
    </Feature>
  </Product>
</Wix>

MGraph et MSchema

Même si je peuvent automatiser la création du fichier XML dans une certaine mesure WiX, je n'est pas réellement souhaite écrire mes paramètres dans un mer de chevrons. " Oslo" me permet d'écrire les de "M", une gamme de langages notamment MSchema, MGrammar et MGraph. (Les spécifications MSchema et M­Grammar se trouve dans" La spécification de langage de modélisation « Oslo »« et » Spécification de langage MGrammar« respectivement.)

Laissez-moi vous donner une introduction rapide aux MGraph et MSchema (j'explorerez MGrammar dans un futur article). Si vous souhaitez lire en même temps que chez vous, je vous recommande vivement le M. Outil epl qui est fourni avec le Oslo Kit de développement logiciel (SDK). ("M. Epl » est comment nous prononcez MREPL.EXE, ce qui signifie pour M Read-évaluation-impression-boucle). Vous pouvez l'utiliser à partir de dans l'éditeur de texte appelée Intellipad fourni dans le Oslo Kit de développement en choisissant Intellipad (exemples activé) dans le menu Démarrer, en appuyant sur CTRL + / pour afficher la mini-buffer et en tapant « SetMode('MScriptMode') » (sans guillemets, mais cas important), suivie d'en cliquant sur Entrée.

MGraph est un langage de définition des instances de données structurées (plus connu sous le nom des valeurs). Dans cet exemple, j'ai défini trois éléments de données : entier anonyme, une collection de trois entiers anonyme et un enregistrement nommé « pt1 » avec deux champs, X et Y, les deux nombres entiers :

42
{ 1, 2, 3 }
pt1 { X = 10, Y = 20 }

MSchema est un langage de définition de contraintes sur les données. Dans MSchema, un ensemble de contraintes est lié ensemble dans un type. Ici, j'ai défini deux types nommés, un type SmallInteger qui contraint le intégré dans type Integer32 à ces seules valeurs inférieure à 256 et un type d'entité de point (le nom de types d'enregistrement dans la mesure) avec deux champs, X et y :

type SmallInteger : Integer32 where value < 256;
type Point { X : Integer32; Y : Integer32; };

X et Y sont limitées peut contenir des valeurs entier entre-2,147,483,648 et 2,147,483,647.

Toute personne lisant cet article est déjà familiarisé avec le CLR. Le CLR utilise quelque chose appelé « nominal tapez, » qui est, nommant le type unique à laquelle appartient une valeur. " D'autre part, M, » est basé sur structurelle taper, bien comme XML. Dans un monde structurellement typé, une valeur peut appartenir à un nombre quelconque de types tant que les données respectent les contraintes définis par ce type. Pour vérifier si une valeur est dans le jeu défini par un type, vous utilisez l'opérateur « en » (présenté ici de dans le M. Outil epl) :

M>>> type SmallInteger : Integer32 where value < 256;
M>>> 4 in SmallInteger
true
M>>> 4 in Integer32
true
M>>> 256 in SmallInteger
false
M>>> 256 in Integer
true

Ici, vous pouvez visualiser que 4 est un SmallInteger et un Integer32, mais 256 est uniquement un Integer32. Valeurs d'entité peuvent être examinées pour appartenir au type ainsi :

M>>> type Point { X : Integer32; Y : Integer32; };
M>>> { X = 100, Y = 200 } in Point
true
M>>> pt1 { X = 10, Y = 20 }
M>>> pt1 in Point
true
M>>> pt1 in { X : SmallInteger; Y : SmallInteger; }
true
M>>> pt1 in { X; Y; }
true

Vous pouvez voir que les paires de Y nommés et non nommées X, sont les points et que les deux champs de la nommé X, Y paire est SmallInteger valeurs, cette fois définition d'un type anonyme pour effectuer la vérification pour vous. La dernière ligne indique que le nommées X, Y paire tienne dans le jeu de valeurs qui ont des champs nommés X et Y, avec aucune restriction sur leurs valeurs, elles peuvent être des chaînes ou dates ou collections ou tout ce qui.

Voici un autre exemple. Dans ce cas, car la nommées X, Y paire n'ont également un champ Z, il ne tient pas dans le type anonyme qui nécessite des champs X, Y et Z :

M>>> pt1 in { X; Y; Z; }
false
M>>> pt1 in { x; y; }
false

En outre, la dernière ligne montre que M est sensible à la casse.

Enfin, vous devrez comprendre les notations de valeur et la collection par défaut :

type Product {
    Name : Text;
    ...
};

type Package {
    Product : Product; // required value
    Keywords : Text*; // collection of 0 or more values
    Description : Text?; // optional value
    Comments : Text?; // optional value
    Manufacturer : Text; // required value
    InstallerVersion : Integer32 = 200; // default value
    Language : Integer32 = 1033; // default value
    Compressed : Logical = true; // defaults value
};

Vous voyez ici le type de package à partir du module WiX. Chaque produit (le concept de niveau supérieur dans une configuration MSI) est un package, qui possède un ensemble facultatif de mots-clés de texte, une description facultative et commentaire un fabricant requis, une version programme d'installation par défaut Windows Installer 2.0, une langue par défaut les États-Unis Anglais et un indicateur de compression la valeur true par défaut.

Les valeurs requises n'ont aucun suffixe, comme produit et du fabricant. Les valeurs par défaut ont un signe égal et une valeur, telle que InstallerVersion et linguistiques. Les valeurs facultatives ont un suffixe d'interrogation, tel que Description et commentaires. Les valeurs de collection (ceux avec des valeurs zéro ou plus) se terminer par étoile. La question marquer et étoile notions ? et *) sont conçus pour vous rappeler des opérateurs Kleene de votre langage de favoris expression régulière.

Voici un exemple de valeur package :

Products { 
    SuperNotepad : Product* {
        Name = "SuperNotepad",
        ...
    }
}

Packages : Package* where item.Product in Products {
    Package1 {
        Product = Products.SuperNotepad,
        Description = "A really super pad for notes",
        Manufacturer = Products.SuperNotepad.Manufacturer,
        Keywords = { "Installer", "Super", "Notepad", "Sample" }
    }
}

Ici, j'ai une partie d'un produit et un package entier. Remarquez que je dispose de deux types de contraintes. Le premier est de type de l'écran «: quelque chose », comme dans :

SuperNotepad : Product* {

Il est appelé type ascription et contraintes toutes les valeurs dans les accolades pour être conforme aux contraintes de type.

La deuxième contrainte est l'emplacement clause qui indique au compilateur de « M » où trouver l'emplacement de stockage pour les valeurs entité produit :

Packages : Package* where item.Product in Products {

Notez également que deux des valeurs ont des noms (SuperNotepad et Package1). La syntaxe MGraph permet des noms à être utilisé au milieu de l'initialisation d'un graphique des valeurs permettant une partie du graphique peut référencer une autre partie sans dupliquer les données. Je suis cela afin que je peut référencer mon produit dans la définition du package.

Comme utile en tant que M. Epl est, vous vous souhaitez utiliser un éditeur de texte pour plus d'éléments. À la fois Visual Studio 2008 et Intellipad offrent une expérience agréable services de langage pour rendre la modification « M ». Par exemple, pour vérifier que vous avez sélectionné un point de vue syntaxique valide, vous pouvez consulter pour obtenir des conseils données sur au cours de la les rouges frappe indiquant des erreurs (par exemple, un manquant fermeture double devis).

Tout code « M » doit être dans un module, comme pour tout le code basées sur .NET doit être dans un espace de noms. Cela étendues les types et les valeurs.

Si l'absence d'au cours de la frappe n'est pas suffisant pour vous rendre à la bonne, vous pouvez également exécuter le compilateur « M » à partir de la ligne de commande :

C:\>set path=%path%;"c:\Program Files\Microsoft Oslo SDK 1.0\Bin"
...
C:\>m.exe /t:none wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.
C:\>

Si aucune erreur signalée par le compilateur "M", votre code est en mode minimal. Notez ici que plus à passer un fichier portant une extension .m à m.exe, je suis également spécifier une cible (via le commutateur / t) aucune. Cela signifie simplement faire la vérification de syntaxe. Sans le commutateur cible, le compilateur "M" tentera d'utiliser votre programme pour générer un script SQL pour créer des tables et insérer des valeurs.

Génération SQL

Si vous essayez de générer SQL du bit d'exemple de données du modèle WiX (après avoir ajouté le guillemet de clôture), vous obtenez un rapport d'erreurs comme celle-ci :

C:\>m wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\wixbits.m(16,9): error M2010: The referenced type 'Product' does not define an identity constraint.
...

Vous pouvez également obtenir ce message d'erreur si vous choisissez mode M | Aperçu de SQL accès de à l'intérieur Intellipad. Que se passe-t-il est que le compilateur « M » tente de générer un script SQL qui correspond aux types et des valeurs définies dans le programme. Elle ne, en tentant de mapper les valeurs nommées niveau supérieur (appelés étendues) pour créer des instructions de la table et pour mapper les valeurs eux-mêmes en insérer des tableaux. Toutefois, comme « M » possède tous les types de données à usage général description utilise, pas tout qu'il mappe sur constructions SQL, par exemple, types d'entité sans champs identité. Il est toujours valide "M", mais non valide pour la génération SQL.

Génération SQL d'est l'action par défaut du compilateur "M", car une base de données relationnelle moderne est un environnement fabulous pour le stockage et manipulation des données. Il a tous les types de fonctionnalités merveilleuse telles que sécurité, la réplication, contrôle de version, l'audit et sur et. Si vous apportez à utiliser de SQL Server pour héberger vos données, vous obtenez toutes ces fonctionnalités, ainsi qu'un ordinateur hôte des optimisations de performances et de robustesse.

Pour rendre vos types de "M" compatible avec SQL Server, le mappage nécessite une colonne compteur, que vous pouvez ajouter à l'aide du code suivant :

type Package {
    Id : Integer32 = AutoNumber();
    ...
} where identity Id;

Comme vous pouvez le voir, je suis créer un champ nommé ID et utiliser la fonction NuméroAuto pour définir une valeur par défaut. Ensuite, j'ajouter une contrainte sur le type à l'aide de l'emplacement mot clé qui marque le champ ID de la colonne des identités. Avec cette en place, j'ai assez données pour obtenir SQL valide pour le type, comme illustré figure 2 .

La figure 2 SQL générée par « M »

...
create table [WixBits].[Packages](
  [Id] int not null identity,
  [Comments] nvarchar(max) null,
  [Compressed] bit not null default 1,
  [Description] nvarchar(max) null,
  [InstallerVersion] int not null default 200,
  [Language] int not null default 1033,
  [Manufacturer] nvarchar(max) not null,
  [Product] int not null,
  constraint [PK_Packages] primary key clustered ([Id]),
  constraint [FK_Packages_Product_WixBits_Products] foreign key ([Product]) references [WixBits].[Products] ([Id])
);
...

create table [WixBits].[Packages_Keywords](
  [_Id] bigint not null identity,
  [Packages_Id] int not null,
  [Item] nvarchar(max) not null,
  constraint [PK_Packages_Keywords] primary key clustered ([_Id]),
  constraint [FK_Packages_Keywords_Packages_Id_WixBits_Packages] foreign key 
  ([Packages_Id]) references [WixBits].[Packages] ([Id]) on delete cascade
);
...

J'espère que le SQL généré par le compilateur « M » correspond à ce que vous souhaitez écrire vous-même. Nom module mapper sur le nom des schémas SQL. Tapez le mappage de noms dans Noms de table. NuméroAuto correspond à l'identité sur le champ, et la contrainte identité associe à la contrainte de clé primaire dans le champ. Intrinsèques types de « M » comme mappage Integer32 et texte passez correspondants types SQL tels qu'int et nvarchar. Champs de la collection, activer le champ de type texte * mots clés, correspond à une autre table pour stocker les zéro ou plusieurs éléments dans cette collection avec la contrainte clée étrangère correspondante. la figure 3 illustre comment mapper les valeurs.

Figure 3 mappage des types de "M" pour SQL

insert into [WixBits].[Packages] ([Product], [Description], [Manufacturer])
 values (@WixBits_Products_Id0, N'A really super pad for notes', @WixBits_Products_Manufacturer0);
declare @WixBits_Packages_Id0 bigint = @@identity;

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Installer', @WixBits_Packages_Id0);

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Super', @WixBits_Packages_Id0);

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Notepad', @WixBits_Packages_Id0);

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Sample', @WixBits_Packages_Id0);

Empaquetage et déploiement

La sortie par défaut du compilateur « M » est SQL, vous souhaiterez probablement exécute un push dans une instance de SQL Server 2008. Par défaut, que SQL se compose en tant que fichier script SQL unique :

C:\>m.exe wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\>dir wixbits.sql
...
11/22/2008  04:43 PM             2,545 wixbits.sql
...

Vous pouvez utiliser ce fichier de script pour remplir votre instance de base de données SQL mais vous le souhaitez, par comme avec sqlcmd.exe ou SQL Server Management Studio. Toutefois, le script SQL a beaucoup moins des métadonnées que le code source « M » d'origine. Si vous souhaitez conserver ces métadonnées, en valeur dans cette opération, comme j'est expliqué dans un instant, vous pouvez choisir le format d'empaquetage image « M » avec le commutateur de ligne de commande /p:image pour m.exe :

C:\>m.exe /p:image wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.
C:\>dir wixbits.mx
...
11/22/2008  04:44 PM             9,073 wixbits.mx
...

Le fichier wixbits.mx est un fichier image « M » qui contient le code SQL généré ainsi qu'un manifest et les autre métadonnées. Puisque le fichier est au format OPC (Open Packaging Conventions), vous pouvez coller une extension de fichier .zip sur ce dernier et ouvrez-le comme tout autre fichier .zip. Plus important encore, toutefois, vous pouvez utiliser un .MX fichier pour les références et déploiement.

Lorsque vous générez un assembly .NET, vous pouvez référencer cet assembly dans le cadre de votre processus génération pour extraire les types publics et statiques instances dans vos programmes basés sur .NET. Si vous utilisez les compilateurs C# ou Visual Basic à partir de la ligne de commande, vous pouvez référencer les assemblys .NET existants avec le commutateur /r (référence). De même, si vous êtes compiler vos programmes de "M", vous pouvez utiliser le commutateur /r sur le compilateur « M » pour extraire dans d'autres types d'images « M ». Pour que cela fonctionne, vous devez tout d'abord exporter vos types ou les étendues du module que vous utilisez référence :

// WixbitsTypes.m 
module WixBits {
    export Product, Package; // export types
    export Products, Packages; // export extents

    type Product {...};
    type Package {...};
    Products : Product*;
    Packages : Package* where item.Product in Products;
}

Vous pouvez ensuite importer types et extensions ont été exportées :

// WixbitsValues.m
module WixBits {
    import WixBits; // bring in exported types and extents
    ...
}

Une fois vous avez créé un fichier image « M » exporte, lorsque vous pouvez référencer que programmes « M » avec les importations de compilation (pour plus d'informations, voir La figure 4 ).

Figure 4 compilation avec importée types et extensions

C:\>m.exe /p:image /t:Repository WixbitsTypes.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\>dir WixbitsTypes.mx
...
11/22/2008  05:48 PM            28,332 WixbitsTypes.mx
...

C:\>m.exe /p:image /t:Repository /r:WixbitsTypes.mx WixbitsValues.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\>dir WixbitsValues.mx
...
11/22/2008  05:50 PM             5,606 WixbitsValues.mx

En outre à Emballage des types et extensions de référence dans d'autres programmes "M", un fichier image « M » peut être déployé à une instance de base de données SQL Server dans l'utilitaire de chargeur "M", mx.exe, de la manière suivante :

C:\>mx.exe /db:Repository /i:WixbitsTypes.mx /i:WixbitsValues.mx
Microsoft (R) "Codename M" Command-line Utility version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

Ici, j'utilise le commutateur /db pour spécifier la base de données pour se connecter à, en supposant que le ordinateur hôte local en tant que serveur de base de données et en installant les fichiers d'image de deux. Je charger les tables dans SQL et les remplir avec les valeurs de mes, qui signifie que J'AI peut utiliser la technologie d'accès aux données de mon choix pour extraire les régulariser à nouveau (ou les mettre à jour ou les supprimer ou insérer de nouvelles). Dans ce cas, j'utilise l'outil de ligne de commande sqlcmd :

C:\>sqlcmd -d Repository
1> select Name from WixBitx.Products
2> go
Name
----------------
SuperNotepad
(1 rows affected)

Alors que Intellipad prend en charge les services de langage "M" de la zone, y compris la génération SQL, il n'est aucun mécanisme pris en charge pour créer l'image ou référence à d'autres images. Toutefois, Visual Studio prend en charge ces fonctionnalités.

Visual Studio Integration

Est le « Oslo » Kit de développement logiciel (SDK) livré avec prise en charge intégrée pour Visual Studio 2008 SP1. Après avoir installé le Kit de développement logiciel (SDK), vous devez le modèle "M" Project installé, comme illustré Figure 5 .

Par défaut, vous obtiendrez un fichier Model1.m ajouté à votre projet. Cette offre les fonctionnalités IntelliSense mêmes que vous avez obtenu en Intellipad. Lorsque vous devez plusieurs fichiers de modèle, vous pouvez cliquez avec le bouton droit sur votre projet dans l'Explorateur de solutions, ajouter un nouvel élément et puis choisissez le modèle "M" Model.

La figure 5, le modèle de projet “M” dans Visual Studio 2008

En outre, si vous souhaitez référencer images « M » existants, vous pouvez le faire en cliquant avec le bouton droit sur votre projet et en choisissant Ajouter une référence, puis en choisissant un fichier .MX. Par exemple, si vous souhaitez créer un projet qui génère les valeurs que j'ai jouer avec et qui référence les types que j'ai été démontrant, il ressemblera figure 6 .

La figure 6 un projet “M” avec code journal et .mx référence de fichier

Lorsque vous créez, vous verrez les erreurs dans la liste d'erreurs que vous Imaginez et la sortie est aller dans \bin\Debug ou \bin\Release (selon la configuration que vous créez), notamment à la fois le .SQL .MX les fichiers et vous pouvez faire avec comme vous le souhaitez (comme mx.exe exécution sur le fichier .MX sortie). Tous ces mêmes éléments fonctionnent également dans la dernière version CTP de Visual Studio 2010.

Le processus de génération dans Visual Studio est déterminée par un fichier MSBuild avec l'extension .mproj (voir figure 7 ). C'est pratique si vous souhaitez utiliser le fichier de cibles de msbuild « Oslo » dans vos propres fichiers de projet.

La figure 7 MSBuild fichier pour les projets "M"

<?xml version="1.0" encoding="utf-8"?>
<Project ...>
  <PropertyGroup>
    <MTarget>Repository</MTarget>
    <MPackageScript>true</MPackageScript>
    <MPackageImage>true</MPackageImage>
    <MTargetsPath Condition="$(MTargetsPath) == ''">
      $(MSBuildExtensionsPath)\Microsoft\M\v1.0</MTargetsPath>
    ...
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="MixbitsValues.m" />
  </ItemGroup>
  <ItemGroup>
    <MReference Include="C:\WixbitsTypes.mx" />
  </ItemGroup>
  <Import Project="$(MTargetsPath)\MProject.targets" />
</Project>

Exemple de code

Le code exemple inclus dans cet article est un utilitaire installer référentiel (repinst.exe) qui comprend un modèle légèrement plus complète pour décrivant les fichiers MSI que J'AI avons examinée ici de miniatures. Une fois que les types et les valeurs qui décrivent les modèles de WiX ont été compilé (à l'aide de m.exe) et chargé dans le référentiel (utilisant mx.exe), en exécutant l'utilitaire repinst.exe sur les données de valeur va lire les données du référentiel, créer un fichier MSI à partir de celui-ci et lancer l'installation, autoriser toute personne ayant accès à la base de données de déployer des applications ainsi chargées, comme illustré figure 8 .

fig08.gif

La figure 8 le repinst exemple en action

J'AI fait des opérations sur cet exemple, principalement réorganisation d'exposition, mais l'essentiel du travail (et le crédit!) accède à Delrue Thomas, Alejandro Trigo et Giovanni della-Libera pour leur travail sur modélisation WiX, traduire « M » dans WiX et produire un fichier MSI à partir de données SQL. Je peut ne jamais ai écrit cet article dans le temps que je L'AI fait sans leur travail révolutionnaire. En outre, grâce à Josh Williams, Martin Gudgin et John Doty un échantillon de toute autre conçu pour Explorer les fonctionnalités de l'espace de stockage que vous allez voir sous le Centre de développement « Oslo » réel bientôt maintenant.

Chris Sells est responsable de programme de la division Connected Systems Division chez Microsoft où il travaille sur techniques de développement d'applications de nouvelle génération. Plus d'informations sur Chris et ses différents projets se trouvent sur sellsbrothers.com.