Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Jan 4, 2026

Visual Studio cannot resolve MSBuild SDKs without explicit versions. The template was generating <Project Sdk="JD.Efcpt.Sdk"> which fails SDK resolution.

Changes

  • Template project file: Changed to <Project Sdk="JD.Efcpt.Sdk/TEMPLATE_SDK_VERSION"> with placeholder
  • Template configuration: Added SdkVersion symbol with TEMPLATE_SDK_VERSION as replacement target
  • Pack-time substitution: Custom MSBuild task replaces placeholder with actual PackageVersion during pack
  • Source restoration: Automatic backup/restore cycle ensures source files maintain placeholders

Implementation

The substitution target runs before GenerateNuspec:

<UsingTask TaskName="ReplaceFileContent" TaskFactory="RoslynCodeTaskFactory" ...>
  <Task>
    <Code Type="Fragment" Language="cs">
      <![CDATA[
        var content = File.ReadAllText(FilePath);
        content = content.Replace(OldValue, NewValue);
        File.WriteAllText(FilePath, content);
      ]]>
    </Code>
  </Task>
</UsingTask>

Generated projects now include: <Project Sdk="JD.Efcpt.Sdk/0.12.3"> (matching template version).

Sample projects remain unchanged—they use global.json for SDK resolution during development.

Original prompt

This section details on the original issue you should resolve

<issue_title>[Bug]: Template does not work in VS</issue_title>
<issue_description>### Description

Image

Steps to Reproduce

Install templates, and add a project

Expected Behavior

The project is added to the solution

Actual Behavior

Error:

Image

Environment

- OS: Win 11
- .NET SDK Version: .NET 10.0.101
- JD.Efcpt.Build Version: 0.12.3

Build Logs

Configuration Files

Additional Context

<Project Sdk="JD.Efcpt.Sdk">

Should probably be:

<Project Sdk="JD.Efcpt.Sdk/0.12.3"></issue_description>

<agent_instructions>We need to ensure each version of our template that releases automatically includes the SDK version in the generated template.</agent_instructions>

Comments on the Issue (you are @copilot in this section)


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Copilot AI and others added 2 commits January 4, 2026 22:41
Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix template not working in Visual Studio Add SDK version to template for Visual Studio compatibility Jan 4, 2026
Copilot AI requested a review from JerrettDavis January 4, 2026 22:49
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes Visual Studio's inability to resolve MSBuild SDKs without explicit versions by adding version information to the template's SDK attribute. The solution implements a pack-time substitution mechanism that automatically injects the correct SDK version into generated projects.

Key Changes

  • Template project file modified to use SDKVERSION_PLACEHOLDER that gets replaced at template instantiation
  • Template configuration enhanced with a SdkVersion symbol parameter with 1.0.0 as default
  • Custom MSBuild tasks added for pack-time substitution and source restoration to maintain placeholders in source files

Reviewed changes

Copilot reviewed 4 out of 5 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/JD.Efcpt.Build.Templates/templates/efcptbuild/EfcptProject.csproj Changed SDK attribute to include version placeholder for template engine replacement
src/JD.Efcpt.Build.Templates/templates/efcptbuild/.template.config/template.json Added SdkVersion symbol configuration with placeholder replacement definition
src/JD.Efcpt.Build.Templates/JD.Efcpt.Build.Templates.csproj Implemented MSBuild targets with custom inline task for pack-time version substitution and restoration
src/JD.Efcpt.Build.Tasks/packages.lock.json Automatic package lock file update with Microsoft.NETFramework.ReferenceAssemblies dependency
.gitignore Added *.bak pattern to exclude backup files created during pack process

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

JerrettDavis and others added 2 commits January 4, 2026 17:37
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@github-actions
Copy link
Contributor

github-actions bot commented Jan 5, 2026

Code Coverage

Summary
  Generated on: 01/05/2026 - 00:22:51
  Coverage date: 01/05/2026 - 00:22:48
  Parser: Cobertura
  Assemblies: 1
  Classes: 80
  Files: 51
  Line coverage: 84%
  Covered lines: 3975
  Uncovered lines: 752
  Coverable lines: 4727
  Total lines: 8541
  Branch coverage: 67.8% (1629 of 2400)
  Covered branches: 1629
  Total branches: 2400
  Method coverage: 94.7% (701 of 740)
  Full method coverage: 82% (607 of 740)
  Covered methods: 701
  Fully covered methods: 607
  Total methods: 740

JD.Efcpt.Build.Tasks                                                                                                                                               84%
  JD.Efcpt.Build.Tasks.AddSqlFileWarnings                                                                                                                        92.7%
  JD.Efcpt.Build.Tasks.ApplyConfigOverrides                                                                                                                       100%
  JD.Efcpt.Build.Tasks.BuildLog                                                                                                                                  66.6%
  JD.Efcpt.Build.Tasks.Chains.ConnectionStringResolutionChain                                                                                                    90.1%
  JD.Efcpt.Build.Tasks.Chains.ConnectionStringResolutionContext                                                                                                   100%
  JD.Efcpt.Build.Tasks.Chains.DirectoryResolutionChain                                                                                                           91.6%
  JD.Efcpt.Build.Tasks.Chains.DirectoryResolutionContext                                                                                                          100%
  JD.Efcpt.Build.Tasks.Chains.FileResolutionChain                                                                                                                 100%
  JD.Efcpt.Build.Tasks.Chains.FileResolutionContext                                                                                                               100%
  JD.Efcpt.Build.Tasks.Chains.ResourceResolutionChain                                                                                                            93.1%
  JD.Efcpt.Build.Tasks.Chains.ResourceResolutionContext                                                                                                           100%
  JD.Efcpt.Build.Tasks.CheckSdkVersion                                                                                                                           41.1%
  JD.Efcpt.Build.Tasks.ComputeFingerprint                                                                                                                        97.8%
  JD.Efcpt.Build.Tasks.Config.CodeGenerationOverrides                                                                                                             100%
  JD.Efcpt.Build.Tasks.Config.EfcptConfigOverrideApplicator                                                                                                      93.1%
  JD.Efcpt.Build.Tasks.Config.EfcptConfigOverrides                                                                                                                100%
  JD.Efcpt.Build.Tasks.Config.FileLayoutOverrides                                                                                                                 100%
  JD.Efcpt.Build.Tasks.Config.NamesOverrides                                                                                                                      100%
  JD.Efcpt.Build.Tasks.Config.ReplacementsOverrides                                                                                                               100%
  JD.Efcpt.Build.Tasks.Config.TypeMappingsOverrides                                                                                                               100%
  JD.Efcpt.Build.Tasks.ConnectionStrings.AppConfigConnectionStringParser                                                                                          100%
  JD.Efcpt.Build.Tasks.ConnectionStrings.AppSettingsConnectionStringParser                                                                                        100%
  JD.Efcpt.Build.Tasks.ConnectionStrings.ConfigurationFileTypeValidator                                                                                           100%
  JD.Efcpt.Build.Tasks.ConnectionStrings.ConnectionStringResult                                                                                                   100%
  JD.Efcpt.Build.Tasks.DacpacFingerprint                                                                                                                         96.1%
  JD.Efcpt.Build.Tasks.DbContextNameGenerator                                                                                                                    83.4%
  JD.Efcpt.Build.Tasks.Decorators.TaskExecutionContext                                                                                                             50%
  JD.Efcpt.Build.Tasks.Decorators.TaskExecutionDecorator                                                                                                          100%
  JD.Efcpt.Build.Tasks.EnsureDacpacBuilt                                                                                                                         96.1%
  JD.Efcpt.Build.Tasks.Extensions.DataRowExtensions                                                                                                               100%
  JD.Efcpt.Build.Tasks.Extensions.EnumerableExtensions                                                                                                            100%
  JD.Efcpt.Build.Tasks.Extensions.StringExtensions                                                                                                                100%
  JD.Efcpt.Build.Tasks.FileHash                                                                                                                                   100%
  JD.Efcpt.Build.Tasks.FileSystemHelpers                                                                                                                          100%
  JD.Efcpt.Build.Tasks.MessageLevelHelpers                                                                                                                        100%
  JD.Efcpt.Build.Tasks.ModuleInitializer                                                                                                                          100%
  JD.Efcpt.Build.Tasks.MsBuildPropertyHelpers                                                                                                                     100%
  JD.Efcpt.Build.Tasks.NullBuildLog                                                                                                                              88.8%
  JD.Efcpt.Build.Tasks.PathUtils                                                                                                                                 91.6%
  JD.Efcpt.Build.Tasks.ProcessResult                                                                                                                              100%
  JD.Efcpt.Build.Tasks.ProcessRunner                                                                                                                               90%
  JD.Efcpt.Build.Tasks.QuerySchemaMetadata                                                                                                                       91.3%
  JD.Efcpt.Build.Tasks.RenameGeneratedFiles                                                                                                                       100%
  JD.Efcpt.Build.Tasks.ResolveDbContextName                                                                                                                       100%
  JD.Efcpt.Build.Tasks.ResolveSqlProjAndInputs                                                                                                                   87.9%
  JD.Efcpt.Build.Tasks.RunEfcpt                                                                                                                                  60.6%
  JD.Efcpt.Build.Tasks.RunSqlPackage                                                                                                                             16.3%
  JD.Efcpt.Build.Tasks.Schema.ColumnModel                                                                                                                         100%
  JD.Efcpt.Build.Tasks.Schema.ColumnNameMapping                                                                                                                   100%
  JD.Efcpt.Build.Tasks.Schema.ConstraintModel                                                                                                                     100%
  JD.Efcpt.Build.Tasks.Schema.DatabaseProviderFactory                                                                                                            94.1%
  JD.Efcpt.Build.Tasks.Schema.ForeignKeyColumnModel                                                                                                               100%
  JD.Efcpt.Build.Tasks.Schema.ForeignKeyModel                                                                                                                      90%
  JD.Efcpt.Build.Tasks.Schema.IndexColumnModel                                                                                                                    100%
  JD.Efcpt.Build.Tasks.Schema.IndexModel                                                                                                                         92.8%
  JD.Efcpt.Build.Tasks.Schema.Providers.FirebirdSchemaReader                                                                                                     98.6%
  JD.Efcpt.Build.Tasks.Schema.Providers.MySqlSchemaReader                                                                                                         100%
  JD.Efcpt.Build.Tasks.Schema.Providers.OracleSchemaReader                                                                                                        100%
  JD.Efcpt.Build.Tasks.Schema.Providers.PostgreSqlSchemaReader                                                                                                    100%
  JD.Efcpt.Build.Tasks.Schema.Providers.SqliteSchemaReader                                                                                                        100%
  JD.Efcpt.Build.Tasks.Schema.Providers.SqlServerSchemaReader                                                                                                     100%
  JD.Efcpt.Build.Tasks.Schema.SchemaFingerprinter                                                                                                                 100%
  JD.Efcpt.Build.Tasks.Schema.SchemaModel                                                                                                                         100%
  JD.Efcpt.Build.Tasks.Schema.SchemaReaderBase                                                                                                                    100%
  JD.Efcpt.Build.Tasks.Schema.TableModel                                                                                                                         92.8%
  JD.Efcpt.Build.Tasks.SerializeConfigProperties                                                                                                                  100%
  JD.Efcpt.Build.Tasks.SqlProjectDetector                                                                                                                        93.3%
  JD.Efcpt.Build.Tasks.StageEfcptInputs                                                                                                                          95.7%
  JD.Efcpt.Build.Tasks.Strategies.CommandNormalizationStrategy                                                                                                   94.1%
  JD.Efcpt.Build.Tasks.Strategies.ProcessCommand                                                                                                                  100%
  JD.Efcpt.Build.Tasks.Utilities.DotNetToolUtilities                                                                                                             66.6%
  System.Text.RegularExpressions.Generated                                                                                                                       80.3%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__AssemblySymbolsMetadataRegex_1   86.2%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__DatabaseKeywordRegex_4           75.7%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__DataSourceKeywordRegex_6         72.3%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__FileNameMetadataRegex_0          86.2%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__InitialCatalogKeywordRegex_5     71.2%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__NonLetterRegex_2                  100%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__SolutionProjectLineRegex_7       82.5%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__TrailingDigitsRegex_3            95.2%

@codecov-commenter
Copy link

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 87.49%. Comparing base (de65ff0) to head (baf8063).

Additional details and impacted files
@@            Coverage Diff             @@
##             main      #55      +/-   ##
==========================================
+ Coverage   79.94%   87.49%   +7.55%     
==========================================
  Files          50       50              
  Lines        3350     3350              
  Branches      455      455              
==========================================
+ Hits         2678     2931     +253     
+ Misses        487      419      -68     
+ Partials      185        0     -185     
Flag Coverage Δ
unittests 87.49% <ø> (+7.55%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@JerrettDavis JerrettDavis marked this pull request as ready for review January 5, 2026 00:26
@JerrettDavis JerrettDavis merged commit bde9fff into main Jan 5, 2026
7 checks passed
@JerrettDavis JerrettDavis deleted the copilot/fix-template-issue-vs branch January 5, 2026 00:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Template does not work in VS

3 participants