Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Dans cet article, vous allez apprendre à créer, gérer et partager Q# des projets. Un Q# projet est une structure de dossiers avec plusieurs Q# fichiers qui peuvent accéder aux opérations et fonctions des autres. Les projets vous aident à organiser logiquement votre code source. Vous pouvez également utiliser des projets en tant que bibliothèques personnalisées accessibles à partir de sources externes.
Prérequis
- Un Azure Quantum espace de travail dans votre abonnement Azure. Pour créer un espace de travail, consultez Créer un Azure Quantum espace de travail.
- Visual Studio Code (VS Code) avec l'extension Azure Quantum Development Kit et l'extension Python installées.
- Un compte GitHub, si vous envisagez de publier votre projet externe dans un dépôt GitHub public.
Pour exécuter des Python programmes, vous avez également besoin des éléments suivants :
Un Python environnement avec Python et Pip installé.
Bibliothèque
qdkPython avec l'extensionazureoptionnelle.python -m pip install --upgrade "qdk[azure]"
Fonctionnement des Q# projets
Un Q# projet contient un Q# fichier manifeste, nommé qsharp.jsonet un ou plusieurs .qs fichiers dans une structure de dossiers spécifiée. Vous pouvez créer un Q# projet manuellement ou directement dans VS Code.
Lorsque vous ouvrez un .qs fichier dans VS Code, le compilateur recherche la hiérarchie des dossiers environnants pour le fichier manifeste et détermine l’étendue du projet. Si aucun fichier manifeste n’est trouvé, le compilateur fonctionne en mode fichier unique.
Lorsque vous définissez le project_root dans un fichier Jupyter Notebook ou Python, le compilateur recherche le fichier manifeste dans le dossier project_root.
Un projet externe Q# est un projet standard Q# qui réside dans un autre répertoire ou sur un dépôt GitHub public et agit comme une bibliothèque personnalisée. Un projet externe utilise export des instructions pour définir les fonctions et les opérations accessibles par des programmes externes. Les programmes définissent le projet externe comme une dépendance dans leur fichier manifeste et utilisent import des instructions pour accéder aux éléments du projet externe, tels que les opérations, les fonctions, les structs et les espaces de noms. Pour plus d’informations, consultez Utilisation de projets en tant que dépendances externes.
Définir un Q# projet
Un Q# projet est défini par la présence d’un fichier manifeste, nommé qsharp.jsonet d’un src dossier, dont les deux doivent se trouver dans le dossier racine du projet. Le src dossier contient les Q# fichiers sources. Pour Q# les programmes et les projets externes, le Q# compilateur détecte automatiquement le dossier du projet. Pour Python les programmes et Jupyter Notebook les fichiers, vous devez spécifier le dossier du Q# projet avec un qsharp.init appel. Toutefois, la structure de dossiers d’un Q# projet est la même pour tous les types de programmes.
Définir le dossier du projet (Q# programmes)
Lorsque vous ouvrez un fichier dans .qs, le VS Code compilateur effectue une Q# recherche vers le haut dans la structure de dossiers d’un fichier manifeste. Si le compilateur trouve un fichier manifeste, le compilateur inclut tous les Q# fichiers du /src répertoire et tous les sous-répertoires. Les éléments définis dans chaque fichier deviennent disponibles pour tous les autres fichiers du projet.
Par exemple, considérez la structure de dossiers suivante :
-
Teleportation_project
- qsharp.json
-
src
- Main.qs
-
TeleportOperations
- TeleportLib.qs
-
PrepareState
- PrepareStateLib.qs
Lorsque vous ouvrez le fichier /src/TeleportOperation/PrepareState/PrepareStateLib.qs, le Q# compilateur effectue les opérations suivantes :
- Vérifie
/src/TeleportOperation/PrepareState/pourqsharp.json. - Vérifie
/src/TeleportOperationpourqsharp.json. - Vérifie
/srcpourqsharp.json. - Vérifie
/*pourqsharp.json. - Établit
/comme répertoire racine du projet et inclut tous les.qsfichiers sous la racine du projet, conformément aux paramètres du fichier manifeste.
Créer un fichier manifeste
Un fichier manifeste est un fichier JSON nommé qsharp.json qui peut éventuellement inclure des champs auteur, licence et lints . Le fichier manifeste minimum viable est la chaîne {}. Lorsque vous créez un Q# projet dans VS Code, un fichier manifeste minimal est créé pour vous.
{}
Exemples de fichiers manifestes
Les exemples suivants montrent comment les fichiers manifeste peuvent définir l’étendue de votre Q# projet.
Dans cet exemple, l’auteur est le seul champ spécifié. Tous les
.qsfichiers de ce répertoire et ses sous-répertoires sont donc inclus dans le Q# projet.{ "author":"Microsoft", "license": "MIT" }Dans un Q# projet, vous pouvez également utiliser le fichier manifeste pour affiner les VS CodeQ# paramètres Linter. Par défaut, les trois règles Linter sont les suivantes :
needlessParens: default =allowdivisionByZero: default =warnredundantSemicolons: default =warnVous pouvez définir chaque règle dans le fichier manifeste sur
allow,warnouerror. Par exemple:{ "author":"Microsoft", "lints": [ { "lint": "needlessParens", "level": "allow" }, { "lint": "redundantSemicolons", "level": "warn" }, { "lint": "divisionByZero", "level": "error" } ] }
Vous pouvez également utiliser le fichier manifeste pour définir un projet externe Q# en tant que dépendance et accéder à distance aux opérations et fonctions dans ce projet externe. Pour plus d’informations, consultez Utilisation de projets en tant que dépendances externes.
Q# exigences et propriétés du projet
Les exigences et configurations suivantes s’appliquent à tous les Q# projets.
Tous les
.qsfichiers que vous souhaitez inclure dans le projet doivent se trouver sous un dossier nommésrc, qui doit se trouver sous le dossier racine du Q# projet. Lorsque vous créez un Q# projet dans VS Code, le/srcdossier est automatiquement créé.Le fichier manifeste doit être au même niveau que le
srcdossier. Lorsque vous créez un Q# projet dans VS Code, un fichier minimal est créé automatiquement.Utilisez des
importinstructions pour référencer des opérations et des fonctions à partir d’autres fichiers du projet.import MyMathLib.*; //imports all the callables in the MyMathLib namespace ... Multiply(x,y);Vous pouvez également les référencer individuellement avec l’espace de noms.
MyMathLib.Multiply(x,y);
Pour les projets Q# uniquement
- Vous pouvez définir une opération de point d’entrée dans un
.qsseul fichier d’un Q# projet, qui est l’opérationMain()par défaut. - Vous devez placer le
.qsfichier avec la définition du point d’entrée au niveau d’un répertoire de projet sous le fichier manifeste. - Toutes les opérations et fonctions du projet Q# qui sont mises en cache et affichées en mode texte prédictif à partir d'un affichage
.qsdans VS Code. - Si l’espace de noms d’une opération ou d’une fonction sélectionnée n’est pas encore importé, VS Code ajoute automatiquement l’instruction nécessaire
import.
Guide pratique pour créer un Q# projet
Pour créer un Q# projet, procédez comme suit :
Dans l’Explorateur VS Code de fichiers, accédez au dossier que vous souhaitez utiliser comme dossier racine pour le Q# projet.
Ouvrez le menu Affichage et choisissez Palette de commandes.
Entrée QDK: Créer le projet Q# et appuyer sur Entrée. VS Code crée un fichier manifeste minimal dans le dossier et ajoute un
/srcdossier avec unMain.qsfichier de modèle.Modifiez le fichier manifeste de votre projet. Consultez les exemples de fichier manifeste.
Ajoutez et organisez vos Q# fichiers sources sous le
/srcdossier.Si vous accédez au Q# projet à partir d’un Python programme ou Jupyter Notebook, définissez le chemin du dossier racine à l’aide de
qsharp.init. Cet exemple suppose que votre programme se trouve dans le/srcdossier du Q# projet :qsharp.init(project_root = '../Teleportation_project')Si vous utilisez uniquement des fichiers Q# dans VS Code, le compilateur recherche un fichier manifeste lorsque vous ouvrez un fichier Q#, détermine le dossier racine du projet, puis analyse le sous-dossier pour les fichiers
.qs.
Remarque
Vous pouvez également créer manuellement le fichier manifeste et le /src dossier.
Exemple de projet
Ce programme de téléportation quantique est un exemple de Q# projet qui s’exécute sur le simulateur local dans VS Code. Pour exécuter le programme sur Azure Quantum du matériel ou des simulateurs tiers, consultez Prise en main des Q# programmes et VS Code pour connaître les étapes à suivre pour compiler votre programme et vous connecter à votre Azure Quantum espace de travail.
Cet exemple présente la structure de répertoires suivante :
-
Teleportation_project
- qsharp.json
-
src
- Main.qs
-
TeleportOperations
- TeleportLib.qs
-
PrepareState
- PrepareStateLib.qs
Le fichier manifeste contient les champs d’auteur et de licence :
{
"author":"Microsoft",
"license":"MIT"
}
Q# fichiers sources
Le fichier principal, nommé Main.qs, contient le point d’entrée et fait référence à l'espace de noms TeleportOperations.TeleportLib à partir de TeleportLib.qs.
import TeleportOperations.TeleportLib.Teleport; // references the Teleport operation from TeleportLib.qs
operation Main() : Unit {
use msg = Qubit();
use target = Qubit();
H(msg);
Teleport(msg, target); // calls the Teleport() operation from TeleportLib.qs
H(target);
if M(target) == Zero {
Message("Teleported successfully!");
Reset(msg);
Reset(target);
}
}
Les TeleportLib.qs fichiers définissent l’opération Teleport et appellent l’opération PrepareBellPair à partir du PrepareStateLib.qs fichier.
import TeleportOperations.PrepareState.PrepareStateLib.*; // references the namespace in PrepareStateLib.qs
operation Teleport(msg : Qubit, target : Qubit) : Unit {
use here = Qubit();
PrepareBellPair(here, target); // calls the PrepareBellPair() operation from PrepareStateLib.qs
Adjoint PrepareBellPair(msg, here);
if M(msg) == One { Z(target); }
if M(here) == One { X(target); }
Reset(here);
}
Le PrepareStateLib.qs fichier contient une opération réutilisable standard pour créer une paire Bell.
operation PrepareBellPair(left : Qubit, right : Qubit) : Unit is Adj + Ctl {
H(left);
CNOT(left, right);
}
Exécuter les programmes
Choisissez l’onglet de l’environnement dans lequel vous exécutez votre programme.
Pour exécuter ce programme, ouvrez le Main.qs fichier dans VS Code et choisissez Exécuter.
Configurer des Q# projets en tant que dépendances externes
Vous pouvez configurer Q# des projets en tant que dépendances externes pour d’autres projets, similaires à une bibliothèque. Les fonctions et les opérations du projet externe Q# sont mises à la disposition de plusieurs Q# projets. Une dépendance externe peut résider sur un partage de lecteur ou être publiée dans un dépôt GitHub public.
Pour utiliser un Q# projet comme dépendance externe, vous devez :
- Ajoutez le projet externe en tant que dépendance dans le fichier manifeste du projet appelant.
- Si le projet externe est publié sur GitHub, ajoutez la propriété fichiers au fichier manifeste du projet externe.
- Ajoutez des
exportinstructions au projet externe. - Ajoutez des
importinstructions au projet appelant.
Configurer les fichiers manifestes
Les projets externes Q# peuvent résider sur un partage de lecteur local ou réseau, ou être publiés dans un dépôt GitHub public.
Fichier manifeste du projet appelant
Pour ajouter une dépendance à un projet externe sur un partage de lecteurs, définissez la dépendance dans le fichier manifeste du projet appelant.
{
"author": "Microsoft",
"license": "MIT",
"dependencies": {
"MyDependency": {
"path": "/path/to/project/folder/on/disk"
}
}
}
Dans le fichier manifeste précédent, MyDependency est une chaîne définie par l’utilisateur qui identifie l’espace de noms lorsque vous appelez une opération. Par exemple, si vous créez une dépendance nommée MyMathFunctions, vous pouvez appeler une fonction à partir de cette dépendance avec MyMathFunctions.MyFunction().
Pour ajouter une dépendance à un projet publié dans un dépôt GitHub public, utilisez l’exemple de fichier manifeste suivant :
{
"author": "Microsoft",
"dependencies": {
"MyDependency": {
"github": {
"owner": "GitHubUser",
"repo": "GitHubRepoName",
"ref": "CommitHash",
"path": "/path/to/dependency"
}
}
}
}
Remarque
Pour les dépendances GitHub, ref fait référence à une réfspec GitHub. Microsoft recommande d’utiliser toujours un hachage de validation pour pouvoir vous appuyer sur une version spécifique de votre dépendance.
Fichier manifeste du projet externe
Si votre projet externe Q# est publié dans un dépôt GitHub public, vous devez ajouter la propriété fichiers au fichier manifeste du projet externe, y compris tous les fichiers utilisés dans le projet.
{
"author": "Microsoft",
"license": "MIT",
"files": [ "src/MyMathFunctions.qs", "src/Strings/MyStringFunctions.qs" ]
}
La propriété fichiers est facultative pour un projet externe importé via "path" (autrement dit, une importation basée sur un chemin de fichier local). La propriété fichiers est requise uniquement pour les projets publiés sur GitHub.
Utiliser l’instruction export
Pour rendre les fonctions et les opérations dans un projet externe accessibles aux projets appelants, utilisez l’instruction export . Vous pouvez exporter l’un ou l’ensemble des callables dans le fichier. La syntaxe des caractères génériques n’est pas prise en charge, vous devez donc spécifier chaque appelable que vous souhaitez exporter.
operation Operation_A() : Unit {
...
}
operation Operation_B() : Unit {
...
}
// makes just Operation_A available to calling programs
export Operation_A;
// makes Operation_A and Operation_B available to calling programs
export Operation_A, Operation_B, etc.;
// makes Operation_A available as 'OpA'
export Operation_A as OpA;
Utiliser l’instruction import
Pour rendre les éléments d’une dépendance externe disponibles, utilisez les déclarations import du programme appelant. L’instruction import utilise l’espace de noms défini pour la dépendance dans le fichier manifeste.
Par exemple, considérez la dépendance dans le fichier manifeste suivant :
{
"author": "Microsoft",
"license": "MIT",
"dependencies": {
"MyMathFunctions": {
"path": "/path/to/project/folder/on/disk"
}
}
}
Importez les fonctions appelables avec le code suivant :
import MyMathFunctions.MyFunction; // imports "MyFunction()" from the namespace
...
L’instruction import prend également en charge la syntaxe de génériques de caractères et les alias.
// imports all items from the "MyMathFunctions" namespace
import MyMathFunctions.*;
// imports the namespace as "Math", all items are accessible via "Math.<callable>"
import MyMathFunctions as Math;
// imports a single item, available in the local scope as "Add"
import MyMathFunctions.MyFunction as Add;
// imports can be combined on one line
import MyMathFunctions.MyFunction, MyMathFunctions.AnotherFunction as Multiply;
Remarque
L’instruction actuellement utilisée open dans Q#, qui est utilisée pour référencer des bibliothèques et des espaces de noms, est toujours prise en charge, mais sera déconseillée finalement. En attendant, vous pouvez éventuellement mettre à jour vos fichiers actuels pour utiliser l’instruction import . Par exemple, open Std.Diagnostics; peut être remplacé par import Std.Diagnostics.*;.
Exemple de projet externe
Pour cet exemple, vous utilisez le même programme de téléportation que l’exemple précédent, en séparant le programme appelant et les éléments appelables dans différents projets.
Créez deux dossiers sur votre lecteur local, par exemple
Project_AetProject_B.Créez un Q# projet dans chaque dossier. Pour plus d’informations, consultez les étapes de création d’un Q# projet.
Dans
Project_A, le programme appelant, collez le code suivant dans le fichier manifeste, mais modifiez le chemin si nécessaire pourProject_B:{ "author": "Microsoft", "license": "MIT", "dependencies": { "MyTeleportLib": { "path": "/Project_B" } } }Dans
Project_A, copiez le code suivant dansMain.qs:import MyTeleportLib.Teleport; // imports the Teleport operation from the MyTeleportLib namespace defined in the manifest file operation Main() : Unit { use msg = Qubit(); use target = Qubit(); H(msg); Teleport(msg, target); // calls the Teleport() operation from the MyTeleportLib namespace H(target); if M(target) == Zero { Message("Teleported successfully!"); Reset(msg); Reset(target); } }Dans
Project_B, copiez le code suivant dansMain.qs:operation Teleport(msg : Qubit, target : Qubit) : Unit { use here = Qubit(); PrepareBellPair(here, target); Adjoint PrepareBellPair(msg, here); if M(msg) == One { Z(target); } if M(here) == One { X(target); } Reset(here); } operation PrepareBellPair(left : Qubit, right : Qubit) : Unit is Adj + Ctl { H(left); CNOT(left, right); } export Teleport; // makes the Teleport operation available to external programsRemarque
Notez que l’opération
PrepareBellPairn’a pas besoin d’être exportée, car elle n’est pas appelée directement à partir de votre programme dansProject_A. Étant donné quePrepareBellPairse trouve dans l’étendue locale deProject_B, il est déjà accessible par l’opérationTeleport.Pour exécuter le programme, ouvrez
/Project_A/Main.qsVS Code et choisissez Exécuter.
Projets et espaces de noms implicites
Dans les Q# projets, si un espace de noms n’est pas spécifié dans un .qs programme, le compilateur utilise le nom de fichier comme espace de noms. Ensuite, lorsque vous référencez un appelant à partir d’une dépendance externe, vous utilisez la syntaxe <dependencyName>.<namespace>.<callable>. Toutefois, si le fichier est nomméMain.qs, le compilateur part du principe que l’espace de noms et la syntaxe appelante sont <dependencyName>.<callable>, comme dans l’exemple précédent. import MyTeleportLib.Teleport
Étant donné que vous avez peut-être plusieurs fichiers projet, vous devez prendre en compte la syntaxe correcte lorsque vous référencez des fonctions appelables. Par exemple, considérez un projet avec la structure de fichiers suivante :
-
/src
- Main.qs
- MathFunctions.qs
Le code suivant effectue des appels à la dépendance externe :
import MyTeleportLib.MyFunction; // "Main" namespace is implied
import MyTeleportLib.MathFunctions.MyFunction; // "Math" namespace must be explicit
Pour plus d’informations sur le comportement de l’espace de noms, consultez Espaces de noms utilisateur.