使用 Q# 專案
透過 Azure Quantum Development Kit的發行,您可以定義 Q# 專案,這些專案是具有多個 Q# 檔案的資料夾結構,可存取彼此的資源。 項目有助於建立可重複使用的連結庫,並以邏輯方式組織原始程式碼。
Q#專案包含Q#名為 qsharp.json 的指令清單檔,以及指定資料夾結構中的一或多個 *.qs 檔案。 當使用者在 VS Code 中開啟 *.qs 檔案,或在 Jupyter Notebook 或 Python 檔案中設定 project_root
時,編譯程式會搜尋周圍資料夾階層中的指令清單檔,並判斷專案的範圍。 如果找不到指令清單檔,編譯程式會以單一檔案模式運作。 Q#您可以手動或在 VS Code 中直接建立專案。
必要條件
- Azure 訂用帳戶中的 Azure Quantum 工作區。 若要建立工作區,請參閱 建立 Azure Quantum 工作區。
- 已安裝 Python 和 Pip 的 Python 環境。
- 已安裝 Azure Quantum Development Kit 和 Python 延伸模組的 Visual Studio Code。
- Azure Quantum
qsharp
和azure-quantum
套件。
Q#定義專案
Q#專案是由qsharp.json指令清單檔和 src 資料夾(其中包含Q#原始程式檔)的存在所定義,這兩者都必須位於專案的根資料夾中。 針對 Q# 程式,編譯程式 Q# 會自動偵測項目資料夾。 針對 Python 程式和 Jupyter Notebook,您必須使用qsharp.init
呼叫來指定Q#項目資料夾。 不過,對於所有類型的程式而言,專案的資料夾結構 Q# 會維持不變。
定義項目資料夾 (Q# 程式)
當 VS Code 中開啟 *.qs 檔案時,編譯 Q# 程式會在資料夾結構 中向上搜尋qsharp.json 指令清單檔。 如果找到指令清單檔,編譯程式接著會向下搜尋 *.qs 檔案的 src 目錄的所有子資料夾,並快取任何作業或函式,並讓這些作業和函式可供所有 *.qs 檔案使用,並依照指令清單檔的排除規則。
例如,假設這個資料夾結構:
- Teleportation_project
- qsharp.json
- src
- RunTeleport.qs
- TeleportOperations
- Teleport.qs
- PrepareState
- PrepareState.qs
當您開啟 /src/TeleportOperation/PrepareState/PrepareState.qs 檔案時,編譯程式Q#:
- 檢查 /src/TeleportOperation/PrepareState/ 是否有 qsharp.json 檔案。
- 檢查 /src/TeleportOperation 是否有 qsharp.json。
- 檢查 /src 是否有 qsharp.json。
- 檢查/qsharp.json。
- /根據指令清單檔的設定,建立為專案的根目錄,並包含專案根目錄下的所有 *.qs 檔案。
建立資訊清單檔
指令清單檔案是名為 qsharp.json 的簡單.json檔案,可選擇性地包含 作者、 授權和 .ints 字段。 最小可行的指令清單檔是字串 {}
。 當您在 VS Code 中建立 Q# 專案時,會為您建立最小的指令清單檔。
{}
指令清單檔案範例
以下是指令清單檔如何定義專案範圍的 Q# 一些範例。
在此範例中, author 是唯一指定的欄位,因此此目錄中的所有 *.qs 檔案及其所有子目錄都會包含在 Q# 專案中。
{
"author":"Microsoft"
}
{
"author":"Microsoft",
"license":"MIT"
}
在 Q# 專案中,您也可以使用指令清單檔來微調 VS Code Q# Linter 設定。 根據預設,三個 Linter 規則為:
needlessParens
:default =allow
divisionByZero
:default =warn
redundantSemicolons
:default =warn
使用指令清單檔,您可以將每個規則設定為 allow
、 warn
或 error
,例如
{
"author":"Microsoft",
"lints": [
{
"lint": "needlessParens",
"level": "allow"
},
{
"lint": "redundantSemicolons",
"level": "warn"
},
{
"lint": "divisionByZero",
"level": "error"
}
]
}
Q# 專案需求和屬性
下列需求和組態適用於所有 Q# 專案。
- 您想要包含在專案中的所有 *.qs 檔案都必須位於名為 src 的資料夾底下,該資料夾必須位於專案根資料夾底下 Q# 。 當您在 VS Code 中建立 Q# 專案時,
/src
會自動建立資料夾。 - qsharp.json指令清單檔應該與 src 資料夾位於相同的層級。 當您在 VS Code 中建立 Q# 專案時, 會自動建立qsharp.json 檔案。
- 您可以使用 語句來存取
open
可用原始程式檔中的作業和函式:
open MyMathLib;
...
Multiply(x,y);
或使用 命名空間來參考它們:
MyMathLib.Multiply(x,y);
僅適用於 Q# 程式
- 專案中只有一個 Q# *.qs 檔案可以
@EntryPoint()
定義。 - 具有
@EntryPoint()
定義的 *.qs 檔案可以位於指令清單檔案下方的任何層級。 - 從 *.qs 檔案快取的任何作業或函式,專案中的任何 Q# 位置會顯示在 VS Code 中的預測文字中。
- 如果尚未新增所選作業或函式的命名空間,VS Code 會自動新增必要的
open
語句。
建立 Q# 專案的步驟
在 VS Code 檔案總管中,以滑鼠右鍵按下您要用於Q#專案根資料夾的資料夾,然後選取 [建立Q#專案],或開啟資料夾,然後選取 [檢視>命令選擇區>Q#:建立Q#專案...]。
VS Code 會在資料夾中建立最小 qsharp.json 指令清單檔案,並使用範本檔案新增
/src
資料夾Main.qs
。視需要編輯指令清單檔案。 請參閱 指令清單檔案範例。
在資料夾下
/src
新增並組織您的Q#原始程序檔。如果您要從 Python 程式或 Jupyter Notebook 存取Q#專案,請使用
qsharp.init
設定根資料夾路徑。 這個範例假設您的程式位於與專案根資料夾相同的資料夾中 Q# :qsharp.init(project_root = './Teleportation_project')
如果您只 Q# 使用 VS Code 中的檔案,當您開啟 Q# 檔案時,編譯程式會搜尋 qsharp.json 指令清單檔、判斷專案根資料夾,然後掃描子資料夾是否有 *.qs 檔案。
注意
您也可以在步驟 2 中手動建立指令清單檔案和 /src
資料夾。
範例專案
此量子遠端傳送程式是以稍早所示的資料夾結構為基礎的專案範例 Q# ,並在 VS Code 中的本機模擬器上執行。 若要在 Azure Quantum 硬體或第三方模擬器上執行程式,請參閱 開始使用 Q# 程式和 VSCode 以取得編譯程式並連線到 Azure 工作區的步驟。
這個範例會使用此目錄結構:
- Teleportation_project
- qsharp.json
- src
- RunTeleport.qs
- TeleportOperations
- Teleport.qs
- PrepareState
- PrepareState.qs
qsharp.json指令清單檔案包含作者和授權欄位:
{
"author":"Microsoft",
"license":"MIT"
}
Q# 來源檔案
有一個小差異 - @EntryPoint()
語句 - 原始程序檔與 Q# 程式、Python 程式或 Jupyter Notebook 相同。
主要檔案 RunTeleport.qs 包含進入點,並參考 TeleportLib
Teleport.qs 中的命名空間。
namespace RunTeleport {
open TeleportLib; // references the TeleportLib namespace in Teleport.qs
@EntryPoint() // @EntryPoint() not necessary for Python or Jupyter Notebook programs
operation RunTeleportationExample() : Unit {
use msg = Qubit();
use target = Qubit();
H(msg);
Teleport(msg, target); // calls the Teleport() operation from Teleport.qs
H(target);
if M(target) == Zero {
Message("Teleported successfully!");
Reset(msg);
Reset(target);
}
}
}
Teleport.qs 會定義作業,Teleport()
並從 PrepareState.qs 呼叫PrepareBellPair()
作業。
namespace TeleportLib {
open PrepareBell; // references the PrepareBell namespace in PrepareState.qs
operation Teleport(msg : Qubit, target : Qubit) : Unit {
use here = Qubit();
PrepareBellPair(here, target); // calls the PrepareBellPair() operation from PrepareState.qs
Adjoint PrepareBellPair(msg, here);
if M(msg) == One { Z(target); }
if M(here) == One { X(target); }
Reset(here);
}
}
PrepareState.qs 檔案包含標準可重複使用的作業,以建立 Bell 配對。
namespace PrepareBell {
operation PrepareBellPair(left : Qubit, right : Qubit) : Unit is Adj + Ctl {
H(left);
CNOT(left, right);
}
}
執行程式
選取您執行程式之環境的索引標籤。
若要執行此程式,請在 VS Code 中開啟 RunTeleport.qs 檔案,然後選取 [ 執行]。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應