Prechádzať zdrojové kódy

Fix workspace Cargo.toml and generated CI (#67)

Loris Leiva 1 rok pred
rodič
commit
8c09a9bd52

+ 5 - 0
.changeset/fluffy-seas-walk.md

@@ -0,0 +1,5 @@
+---
+"create-solana-program": patch
+---
+
+Fix workspace Cargo.toml and generated CI

+ 15 - 4
.github/workflows/main.yml

@@ -8,7 +8,8 @@ on:
 
 env:
   ANCHOR_VERSION: 0.30.0
-  SOLANA_VERSION: 1.18.12
+  SOLANA_VERSION: 1.18.18
+  TOOLCHAIN: 1.75.0
 
 jobs:
   lint:
@@ -35,14 +36,14 @@ jobs:
     strategy:
       matrix:
         project: ["counter-anchor", "counter-shank"]
-        solana: ["1.17.24", "1.18.12"]
+        solana: ["1.17.34", "1.18.18"]
         include:
           - anchor: "0.30.0"
             project: "counter-anchor"
-            solana: "1.18.12"
+            solana: "1.18.18"
           - anchor: "0.29.0"
             project: "counter-anchor"
-            solana: "1.17.24"
+            solana: "1.17.34"
     steps:
       - name: Git checkout
         uses: actions/checkout@v4
@@ -61,6 +62,16 @@ jobs:
         uses: metaplex-foundation/actions/install-solana@v1
         with:
           version: ${{ matrix.solana }}
+      - name: Install Rustfmt
+        uses: dtolnay/rust-toolchain@master
+        with:
+          toolchain: ${{ env.TOOLCHAIN }}
+          components: rustfmt
+      - name: Install Clippy
+        uses: dtolnay/rust-toolchain@master
+        with:
+          toolchain: ${{ env.TOOLCHAIN }}
+          components: clippy
       - name: Install Anchor
         if: ${{ matrix.anchor }}
         uses: metaplex-foundation/actions/install-anchor-cli@v1

+ 0 - 6
template/anchor/base/Cargo.toml

@@ -1,6 +0,0 @@
-[workspace]
-resolver = "2"
-members = ["program"]
-
-[profile.release]
-overflow-checks = true

+ 1 - 1
template/anchor/base/program/Cargo.toml.njk

@@ -21,4 +21,4 @@ idl-build = ["anchor-lang/idl-build"]
 
 [dependencies]
 anchor-lang = "{{ anchorVersion }}"
-solana-program = "~{{ solanaVersion }}"
+solana-program = "~{{ solanaVersionWithoutPatch }}"

+ 0 - 6
template/anchor/clients/rust/Cargo.toml

@@ -1,6 +0,0 @@
-[workspace]
-resolver = "2"
-members = ["clients/rust", "program"]
-
-[profile.release]
-overflow-checks = true

+ 1 - 1
template/base/.github/actions/setup/action.yml.njk

@@ -48,7 +48,7 @@ runs:
       shell: bash
       run: pnpm zx ./scripts/ci/set-env.mjs
 
-{% if solanaVersion === '2.0' %}
+{% if solanaVersionWithoutPatch === '2.0' %}
     - name: Install Protobuf Compiler (Temporary Workaround for Solana 2.0)
       if: {% raw %}${{ inputs.solana || inputs.rustfmt == 'true' || inputs.clippy == 'true' }}{% endraw %}
       shell: bash

+ 2 - 2
template/base/.github/workflows/main.yml.njk

@@ -8,9 +8,9 @@ on:
 
 env:
   NODE_VERSION: 18
-  SOLANA_VERSION: 1.18.12
+  SOLANA_VERSION: {{ solanaVersion }}
 {% if programFramework === 'anchor' %}
-  ANCHOR_VERSION: 0.30.0
+  ANCHOR_VERSION: {{ anchorVersion }}
 {% endif %}
 
 jobs:

+ 9 - 0
template/base/Cargo.toml.njk

@@ -1,6 +1,15 @@
 [workspace]
 resolver = "2"
+{% if rustClient %}
+members = ["clients/rust", "program"]
+{% else %}
 members = ["program"]
+{% endif %}
+
+{% if programFramework === 'anchor' %}
+[profile.release]
+overflow-checks = true
+{% endif %}
 
 # Specify Rust toolchains for rustfmt, clippy, and build.
 # Any unprovided toolchains default to stable.

+ 0 - 3
template/clients/rust/Cargo.toml

@@ -1,3 +0,0 @@
-[workspace]
-resolver = "2"
-members = ["clients/rust", "program"]

+ 3 - 3
template/clients/rust/clients/rust/Cargo.toml.njk

@@ -15,10 +15,10 @@ num-derive = "^0.3"
 num-traits = "^0.2"
 serde = { version = "^1.0", features = ["derive"], optional = true }
 serde_with = { version = "^3.0", optional = true }
-solana-program = "~{{ solanaVersion }}"
+solana-program = "~{{ solanaVersionWithoutPatch }}"
 thiserror = "^1.0"
 
 [dev-dependencies]
 assert_matches = "1.5.0"
-solana-program-test = "~{{ solanaVersion }}"
-solana-sdk = "~{{ solanaVersion }}"
+solana-program-test = "~{{ solanaVersionWithoutPatch }}"
+solana-sdk = "~{{ solanaVersionWithoutPatch }}"

+ 1 - 1
template/shank/base/program/Cargo.toml.njk

@@ -19,5 +19,5 @@ borsh = "^0.10"
 shank = "^0.4.2"
 num-derive = "^0.3"
 num-traits = "^0.2"
-solana-program = "~{{ solanaVersion }}"
+solana-program = "~{{ solanaVersionWithoutPatch }}"
 thiserror = "^1.0"

+ 46 - 8
utils/getRenderContext.ts

@@ -21,6 +21,7 @@ export type RenderContext = Omit<Inputs, 'programAddress' | 'solanaVersion'> & {
   packageManager: PackageManager;
   solanaVersion: string;
   solanaVersionDetected: string;
+  solanaVersionWithoutPatch: string;
   targetDirectory: string;
   templateDirectory: string;
   toolchain: string;
@@ -45,10 +46,16 @@ export function getRenderContext({
   );
   const getNpmCommand: RenderContext['getNpmCommand'] = (...args) =>
     getPackageManagerCommand(packageManager, ...args);
-  const solanaVersion =
-    inputs.solanaVersion ??
-    toMinorSolanaVersion(language, solanaVersionDetected);
-  const toolchain = getToolchainFromSolanaVersion(solanaVersion);
+  const solanaVersion = resolveSolanaVersion(
+    language,
+    inputs.solanaVersion,
+    solanaVersionDetected
+  );
+  const solanaVersionWithoutPatch = toMinorSolanaVersion(
+    language,
+    solanaVersion
+  );
+  const toolchain = getToolchainFromSolanaVersion(solanaVersionWithoutPatch);
 
   // Directories.
   const templateDirectory = path.resolve(__dirname, 'template');
@@ -62,7 +69,7 @@ export function getRenderContext({
 
   return {
     ...inputs,
-    anchorVersion: anchorVersionDetected ?? '',
+    anchorVersion: resolveAnchorVersion(anchorVersionDetected),
     clientDirectory,
     clients,
     currentDirectory,
@@ -73,18 +80,49 @@ export function getRenderContext({
     programDirectory,
     solanaVersion,
     solanaVersionDetected,
+    solanaVersionWithoutPatch,
     targetDirectory,
     templateDirectory,
     toolchain,
   };
 }
 
-function getToolchainFromSolanaVersion(solanaVersion: string): string {
+function getToolchainFromSolanaVersion(
+  solanaVersionWithoutPatch: string
+): string {
   const map: Record<string, string> = {
-    '1.17': '1.68.0',
+    '1.17': '1.75.0',
     '1.18': '1.75.0',
     '2.0': '1.75.0',
   };
 
-  return map[solanaVersion] ?? '1.75.0';
+  return map[solanaVersionWithoutPatch] ?? '1.75.0';
+}
+
+function resolveSolanaVersion(
+  language: Language,
+  inputVersion: string | undefined,
+  detectedVersion: string
+): string {
+  if (!inputVersion) {
+    return detectedVersion;
+  }
+  if (!inputVersion.match(/^\d+\.\d+(\.\d+)?$/)) {
+    throw new Error(
+      language.errors.invalidSolanaVersion.replace('$version', inputVersion)
+    );
+  }
+  const versionSegments = inputVersion.split('.');
+  if (versionSegments.length === 3) {
+    return inputVersion;
+  }
+  const map: Record<string, string> = {
+    '1.17': '1.17.34',
+    '1.18': '1.18.18',
+  };
+  return map[inputVersion] ?? `${inputVersion}.0`;
+}
+
+function resolveAnchorVersion(detectedVersion: string | undefined): string {
+  return detectedVersion ?? '';
 }

+ 7 - 1
utils/runCommands.ts

@@ -19,9 +19,15 @@ export async function hasCommand(command: string): Promise<boolean> {
 
 export async function waitForCommand(child: ChildProcess): Promise<number> {
   return new Promise((resolve, reject) => {
+    const errorLogs: string[] = [];
+    child.stderr?.on('data', (data) => {
+      errorLogs.push(data.toString());
+    });
+
     child.on('close', (code) => {
       if (code !== 0) {
-        const message = `$(${child}) exited with code ${code}`;
+        console.log(errorLogs.join(''));
+        const message = `$(${child.spawnargs.join(' ')}) exited with code ${code}`;
         reject(new Error(message));
       } else {
         resolve(code);

+ 4 - 4
utils/solanaCli.ts

@@ -44,15 +44,15 @@ export async function detectAnchorVersion(language: Language): Promise<string> {
 }
 
 export async function patchSolanaDependencies(
-  ctx: Pick<RenderContext, 'solanaVersion' | 'targetDirectory'>
+  ctx: Pick<RenderContext, 'solanaVersionWithoutPatch' | 'targetDirectory'>
 ): Promise<void> {
   const patchMap: Record<string, string[]> = {
-    '1.17': ['-p ahash@0.8 --precise 0.8.6'],
+    '1.17': ['-p ahash@0.8.11 --precise 0.8.6'],
   };
 
-  const patches = patchMap[ctx.solanaVersion] ?? [];
+  const patches = patchMap[ctx.solanaVersionWithoutPatch] ?? [];
   await Promise.all(
-    patches.map((patch) =>
+    patches.map(async (patch) =>
       waitForCommand(
         spawnCommand('cargo', ['update', ...patch.split(' ')], {
           cwd: ctx.targetDirectory,