Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
c89402d
Enable VS source debugging for SDK-style projects (full PDB + F5 wiring)
danielmeza Jun 16, 2026
ecb7c02
Target v2 firmware: MDP 4.x (NFMRK2) + net8.0 task TFM
danielmeza Jun 16, 2026
6689c72
Add NanoMigrate converter under tools/ (moved from the extension plan…
danielmeza Jun 16, 2026
5ce0c08
NanoMigrate: exit cleanly when there is nothing to convert (reentrancy)
danielmeza Jun 16, 2026
4667760
Split the SDK props/targets into focused modular includes
danielmeza Jun 16, 2026
a733b93
NanoMigrate: Spectre.Console UI + --glob filtering + test-first workflow
danielmeza Jun 16, 2026
cc60824
Replace the binary .skill with a proper text skill; drop nano-migrate.py
danielmeza Jun 16, 2026
a647853
Restructure NanoMigrate into Core (library) + Cli (Spectre.Cli) + Tes…
danielmeza Jun 16, 2026
4d1fb24
NanoMigrate: solution-aware migration (.sln + .slnx input/output)
danielmeza Jun 16, 2026
b4de030
skill: document solution-aware migration (.sln/.slnx input, selection)
danielmeza Jun 16, 2026
ce08e9c
NanoMigrate: packages.config-first resolution + Central Package Manag…
danielmeza Jun 16, 2026
1fc58bd
NanoMigrate: pass through all non-boilerplate properties (fixes dropp…
danielmeza Jun 16, 2026
b50a97c
NanoMigrate: harden item/import handling so migrated samples build
danielmeza Jun 16, 2026
58b5afd
SDK: also define NANOFRAMEWORK_1_0 for source compatibility
danielmeza Jun 16, 2026
48b8b40
Add the dotnet-nano umbrella tool (built-in migrate + external nanoff…
danielmeza Jun 16, 2026
87f26ee
NanoMigrate: build-verification, user-confirmed rollback, and a clean…
danielmeza Jun 16, 2026
d72da89
NanoMigrate: read/write solutions via Microsoft.VisualStudio.Solution…
danielmeza Jun 16, 2026
ceab679
NanoMigrate.Core: reorganize into vertical-slice feature folders
danielmeza Jun 16, 2026
48d5817
NanoMigrate: migrate --report <path> (Markdown or HTML)
danielmeza Jun 16, 2026
b7136f2
NanoMigrate: --no-backup fully suppresses loose .bak; clean ignores j…
danielmeza Jun 16, 2026
4a1883f
Move the dotnet-nano umbrella to tools/nano (out of src/)
danielmeza Jun 16, 2026
967078f
Rename the migrate tool grouping dir: tools/NanoMigrate -> tools/migrate
danielmeza Jun 16, 2026
dc47d40
docs(skill): update tool path tools/NanoMigrate -> tools/migrate
danielmeza Jun 16, 2026
7c05b4a
docs: add nano + nano-migrate tool READMEs; expand migration skill
danielmeza Jun 16, 2026
934b9a3
Wrk CI-CD
josesimoes Jun 18, 2026
ea7fcd1
Move the dotnet nano and nano-migrate tools to nanoframework/nf-tools
danielmeza Jun 23, 2026
f1f9632
Merge branch 'main' into move-to-sdk
danielmeza Jun 23, 2026
5209ab5
Merge branch 'main' into move-to-sdk
josesimoes Jun 23, 2026
dfdc011
Update Microsoft.Build refs to latest 17.x
josesimoes Jun 23, 2026
466e590
Remove unnecessary comment
josesimoes Jun 23, 2026
1114975
Update MDP ref to 4.0.0-preview.98
josesimoes Jun 23, 2026
d9ad850
Fix AZDO pipeline
josesimoes Jun 23, 2026
b142c32
Fix nuget config to allow local build
josesimoes Jun 23, 2026
4a546ac
Work CI-CD
josesimoes Jun 23, 2026
8cad910
Merge branch 'main' of https://github.com/nanoframework/nanoFramework…
josesimoes Jun 23, 2026
5d4318f
Work CI-CD
josesimoes Jun 23, 2026
86a9f92
Merge branch 'main' of https://github.com/nanoframework/nanoFramework…
josesimoes Jun 23, 2026
a93677a
Work CI-CD
josesimoes Jun 23, 2026
ce2eb05
Merge branch 'main' of https://github.com/nanoframework/nanoFramework…
josesimoes Jun 23, 2026
2bc2dc4
Work CI-CD
josesimoes Jun 23, 2026
7447c74
Merge branch 'main' of https://github.com/nanoframework/nanoFramework…
josesimoes Jun 23, 2026
7e6eff5
Work CI-CD
josesimoes Jun 23, 2026
48be656
Merge branch 'main' of https://github.com/nanoframework/nanoFramework…
josesimoes Jun 23, 2026
0bfd85c
Work CI-CD
josesimoes Jun 23, 2026
2dc937f
Merge branch 'main' of https://github.com/nanoframework/nanoFramework…
josesimoes Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,16 @@ Or pin the SDK version in `global.json`:

```
src/
nanoFramework.Sdk/ SDK NuGet package (Sdk.props / Sdk.targets)
nanoFramework.NET.Sdk/ SDK NuGet package (Sdk.props / Sdk.targets)
nanoFramework.Tools.BuildTasks/ Custom MSBuild tasks (resource gen, binary output, etc.)
```

## Tools

The `dotnet nano` umbrella CLI and the `nano-migrate` project migrator (with the companion
SDK-migration skill) live in the [nanoframework/nf-tools](https://github.com/nanoframework/nf-tools)
repository, under `tools/nano` and `tools/migrate`.

## Development

```bash
Expand Down
358 changes: 194 additions & 164 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,177 +41,207 @@ stages:
########################
- stage: Build
jobs:
- job: Build_SDK
pool:
vmImage: 'windows-latest'

variables:
- group: sign-client-credentials
- name: buildPlatform
value: 'Any CPU'
- name: buildConfiguration
value: 'Release'
- name: solution
value: 'nanoFramework.NET.Sdk.sln'

steps:
- checkout: self
submodules: true
fetchDepth: 0

- script: |
git config --global user.email nanoframework@outlook.com
git config --global user.name nfbot
git config --global core.autocrlf true
displayName: Setup git identity

- template: install-nbgv-tool.yml@templates

# waiting for project to be public to enable SonarCloud analysis
# - task: SonarCloudPrepare@3
# condition: >-
# and(
# succeeded(),
# eq(variables['StartReleaseCandidate'], false),
# not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v')),
# not(${{ parameters.skipSonarCloudAnalysis }})
# )
# displayName: 'Prepare analysis on SonarCloud'
# inputs:
# SonarCloud: 'sonarcloud-$(System.TeamProject)'
# organization: 'nanoframework'
# scannerMode: 'dotnet'
# projectKey: 'nanoframework_net-sdk'
# extraProperties: |
# sonar.exclusions=**/obj/**,**/*.dll
# sonar.cs.vscoveragexml.reportsPaths=$(Agent.TempDirectory)/**/**.coverage
# sonar.cs.vstest.reportsPaths=$(Agent.TempDirectory)/**/**.trx
# sonar.scanner.skipJreProvisioning=true

- template: install-nuget.yml@templates

- task: DotNetCoreCLI@2
displayName: Build
inputs:
command: 'build'
projects: '$(solution)'
arguments: '--configuration $(buildConfiguration) /p:PublicRelease=true'

# waiting for project to be public to enable SonarCloud analysis
# - task: SonarCloudAnalyze@3
# condition: >-
# and(
# succeeded(),
# eq(variables['StartReleaseCandidate'], false),
# not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
# )
# displayName: 'Run Code Analysis'
# continueOnError: true

# waiting for project to be public to enable SonarCloud analysis
# - task: SonarCloudPublish@3
# condition: >-
# and(
# succeeded(),
# eq(variables['StartReleaseCandidate'], false),
# not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
# )
# displayName: 'Publish Quality Gate Result'
# continueOnError: true

- task: DotNetCoreCLI@2
displayName: Install Sign Client CLI
condition: >-
and(
succeeded(),
eq(variables['StartReleaseCandidate'], false),
not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
)
inputs:
command: custom
custom: tool
arguments: install --tool-path . sign --version 0.9.1-beta.23530.1

- pwsh: |
.\sign code azure-key-vault `
"**/nanoFramework.Tools.BuildTasks.*" `
--base-directory "$(Build.SourcesDirectory)/nanoFramework.NET.Sdk/build/Release" `
--description "$(Build.Repository.Name)" `
--description-url "https://github.com/$(Build.Repository.Name)" `
--azure-key-vault-tenant-id "$(SignTenantId)" `
--azure-key-vault-client-id "$(SignClientId)" `
--azure-key-vault-client-secret "$(SignClientSecret)" `
--azure-key-vault-certificate "$(SignKeyVaultCertificate)" `
--azure-key-vault-url "$(SignKeyVaultUrl)" `
--timestamp-url http://timestamp.digicert.com
displayName: Sign DLLs
continueOnError: false
condition: >-
and(
succeeded(),
eq(variables['StartReleaseCandidate'], false),
not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
)
- job: Build_SDK
pool:
vmImage: 'windows-latest'

- task: DotNetCoreCLI@2
displayName: Pack
inputs:
command: 'pack'
packagesToPack: '**/src/nanoFramework.NET.Sdk.csproj'
versioningScheme: 'off'
arguments: '--configuration $(buildConfiguration) /p:PublicRelease=true --output $(Build.ArtifactStagingDirectory)'

- pwsh: |
.\sign code azure-key-vault `
"**/*.nupkg" `
--base-directory "$(Build.ArtifactStagingDirectory)" `
--description "$(Build.Repository.Name)" `
--description-url "https://github.com/$(Build.Repository.Name)" `
--azure-key-vault-tenant-id "$(SignTenantId)" `
--azure-key-vault-client-id "$(SignClientId)" `
--azure-key-vault-client-secret "$(SignClientSecret)" `
--azure-key-vault-certificate "$(SignKeyVaultCertificate)" `
--azure-key-vault-url "$(SignKeyVaultUrl)" `
--timestamp-url http://timestamp.digicert.com
displayName: Sign NuGet package
continueOnError: true
condition: >-
and(
succeeded(),
eq(variables['StartReleaseCandidate'], false),
not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
)
variables:
- group: sign-client-credentials
- name: buildPlatform
value: 'Any CPU'
- name: buildConfiguration
value: 'Release'
- name: solution
value: 'nanoFramework.NET.Sdk.sln'

steps:
- checkout: self
submodules: true
fetchDepth: 0

- script: |
git config --global user.email nanoframework@outlook.com
git config --global user.name nfbot
git config --global core.autocrlf true
displayName: Setup git identity

- template: install-nbgv-tool.yml@templates

# waiting for project to be public to enable SonarCloud analysis
# - task: SonarCloudPrepare@3
# condition: >-
# and(
# succeeded(),
# eq(variables['StartReleaseCandidate'], false),
# not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v')),
# not(${{ parameters.skipSonarCloudAnalysis }})
# )
# displayName: 'Prepare analysis on SonarCloud'
# inputs:
# SonarCloud: 'sonarcloud-$(System.TeamProject)'
# organization: 'nanoframework'
# scannerMode: 'dotnet'
# projectKey: 'nanoframework_net-sdk'
# extraProperties: |
# sonar.exclusions=**/obj/**,**/*.dll
# sonar.cs.vscoveragexml.reportsPaths=$(Agent.TempDirectory)/**/**.coverage
# sonar.cs.vstest.reportsPaths=$(Agent.TempDirectory)/**/**.trx
# sonar.scanner.skipJreProvisioning=true

- task: PublishPipelineArtifact@1
displayName: Publish NuGet package
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)'
artifactName: 'NuGetPackage'
artifactType: 'pipeline'

- task: NuGetCommand@2
condition: >-
and(
succeeded(),
eq(variables['System.PullRequest.PullRequestId'], ''),
not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')),
eq(variables['StartReleaseCandidate'], false),
not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
- template: install-nuget.yml@templates

- task: DotNetCoreCLI@2
displayName: Build
inputs:
command: 'build'
projects: '$(solution)'
arguments: '--configuration $(buildConfiguration) /p:PublicRelease=true'

# waiting for project to be public to enable SonarCloud analysis
# - task: SonarCloudAnalyze@3
# condition: >-
# and(
# succeeded(),
# eq(variables['StartReleaseCandidate'], false),
# not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
# )
# displayName: 'Run Code Analysis'
# continueOnError: true

# waiting for project to be public to enable SonarCloud analysis
# - task: SonarCloudPublish@3
# condition: >-
# and(
# succeeded(),
# eq(variables['StartReleaseCandidate'], false),
# not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
# )
# displayName: 'Publish Quality Gate Result'
# continueOnError: true

- task: DotNetCoreCLI@2
displayName: Install Sign Client CLI
condition: >-
and(
succeeded(),
eq(variables['StartReleaseCandidate'], false),
not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
)
inputs:
command: custom
custom: tool
arguments: install --tool-path . sign --version 0.9.1-beta.23530.1

- pwsh: |
.\sign code azure-key-vault `
"**/nanoFramework.Tools.BuildTasks.*" `
--base-directory "$(Build.SourcesDirectory)/nanoFramework.NET.Sdk/build/Release" `
--description "$(Build.Repository.Name)" `
--description-url "https://github.com/$(Build.Repository.Name)" `
--azure-key-vault-tenant-id "$(SignTenantId)" `
--azure-key-vault-client-id "$(SignClientId)" `
--azure-key-vault-client-secret "$(SignClientSecret)" `
--azure-key-vault-certificate "$(SignKeyVaultCertificate)" `
--azure-key-vault-url "$(SignKeyVaultUrl)" `
--timestamp-url http://timestamp.digicert.com
displayName: Sign DLLs
continueOnError: false
condition: >-
and(
succeeded(),
eq(variables['StartReleaseCandidate'], false),
not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
)

- task: DotNetCoreCLI@2
displayName: Pack
inputs:
command: 'pack'
packagesToPack: '**/src/nanoFramework.NET.Sdk.csproj'
versioningScheme: 'off'
arguments: '--configuration $(buildConfiguration) /p:PublicRelease=true --output $(Build.ArtifactStagingDirectory)'

- pwsh: |
.\sign code azure-key-vault `
"**/*.nupkg" `
--base-directory "$(Build.ArtifactStagingDirectory)" `
--description "$(Build.Repository.Name)" `
--description-url "https://github.com/$(Build.Repository.Name)" `
--azure-key-vault-tenant-id "$(SignTenantId)" `
--azure-key-vault-client-id "$(SignClientId)" `
--azure-key-vault-client-secret "$(SignClientSecret)" `
--azure-key-vault-certificate "$(SignKeyVaultCertificate)" `
--azure-key-vault-url "$(SignKeyVaultUrl)" `
--timestamp-url http://timestamp.digicert.com
displayName: Sign NuGet package
continueOnError: true
condition: >-
and(
succeeded(),
eq(variables['StartReleaseCandidate'], false),
not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
)

- task: PublishPipelineArtifact@1
displayName: Publish NuGet package
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)'
artifactName: 'NuGetPackage'
artifactType: pipeline

- task: PowerShell@2
displayName: Create NuGet config for SmokeTest
inputs:
targetType: inline
script: |
$nugetConfig = @(
'<?xml version="1.0" encoding="utf-8"?>'
'<configuration>'
' <packageSources>'
' <clear />'
' <add key="local-sdk" value="$(Build.ArtifactStagingDirectory)" />'
' <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />'
' </packageSources>'
'</configuration>'
)
continueOnError: true
displayName: Push NuGet package to NuGet
inputs:
command: push
nuGetFeedType: external
allowPackageConflicts: true
packagesToPush: '$(Build.ArtifactStagingDirectory)/*.nupkg'
publishFeedCredentials: 'NuGet-$(System.TeamProject)'
$nugetConfig | Set-Content -Path "$(Build.SourcesDirectory)/test/SmokeTest/NuGet.Azdo.Config"

- task: DotNetCoreCLI@2
displayName: Restore SmokeTest
inputs:
command: 'restore'
projects: 'test/SmokeTest/SmokeTest.csproj'
feedsToUse: 'config'
nugetConfigPath: '$(Build.SourcesDirectory)/test/SmokeTest/NuGet.Azdo.Config'

- task: DotNetCoreCLI@2
displayName: Build SmokeTest
inputs:
command: 'build'
projects: 'test/SmokeTest/SmokeTest.csproj'
arguments: '--configuration $(buildConfiguration) --no-restore'

- task: NuGetCommand@2
condition: >-
and(
succeeded(),
eq(variables['System.PullRequest.PullRequestId'], ''),
not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')),
eq(variables['StartReleaseCandidate'], false),
not(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
)
continueOnError: true
displayName: Push NuGet package to NuGet
inputs:
command: push
nuGetFeedType: external
allowPackageConflicts: true
packagesToPush: '$(Build.ArtifactStagingDirectory)/*.nupkg'
publishFeedCredentials: 'NuGet-$(System.TeamProject)'

# report build failure to Discord
- stage: Report_Build_Failure
dependsOn:
- Build
dependsOn: Build
condition: failed('Build')

jobs:
Expand Down
Loading