ImageOptimizer - 逐步更新 Visual Studio 扩展
本指南将介绍添加 Visual Studio 2022 支持所需的所有步骤,同时使用图像优化器扩展作为案例研究来维护 Visual Studio 2019 支持。
这是一个全面的指南,其中包含每个步骤的 git 提交链接,但你可以在此处免费查看最终的 PR:https://github.com/madskristensen/ImageOptimizer/pull/46
。
本指南还在末尾处提供了其他示例。
步骤 1 - 现代化项目
请参阅对项目进行现代化改造。
首先,在项目的“属性”页下将 VSIX 和单元测试项目升级到 .NET 4.7.2:
图片优化器引用了一些旧的自定义 14.* 和 15.* 包,因此我们将安装 Microsoft.VisualStudio.Sdk
NuGet 包,这将汇总所有必需的引用。
- <ItemGroup>
- <PackageReference Include="Madskristensen.VisualStudio.SDK">
- <Version>14.0.0-beta4</Version>
- </PackageReference>
- <PackageReference Include="Microsoft.VSSDK.BuildTools">
- <Version>15.8.3247</Version>
- <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
- <PrivateAssets>all</PrivateAssets>
- </PackageReference>
- </ItemGroup>
+ <ItemGroup>
+ <PackageReference Include="Microsoft.VisualStudio.SDK">
+ <Version>16.9.31025.194</Version>
+ </PackageReference>
+ </ItemGroup>
生成项目成功,我们收到一些线程警告。 我们通过单击 ctrl
和 .
并使用 intellisense 添加缺少的线程切换行来修复这些警告。
步骤 2 - 将源代码重构到共享项目中
请参阅共享项目。
支持 Visual Studio 2022 需要添加新的共享项目,其中包含将在 Visual Studio 2019 和 Visual Studio 2022 VSIX 项目之间共享的扩展源代码。
将新的共享项目添加到解决方案
在 VSIX 项目中添加一个共享项目的引用。
将源代码文件(cs、xaml、resx)移动到新的共享项目 ,但以下 除外:
source.extension.vsixmanifest
- 扩展元数据文件(图标、许可证、发行说明等)
- VSCT 文件
- 链接的文件
- 需要包含在 VSIX 中的外部工具或库
现在,将所有元数据、VSCT 文件、链接文件和外部工具/库移动到共享位置,并将其添加回 VSIX 项目的链接项。 请勿删除
source.extension.vsixmanifest
。- 对于此项目,我们需要将扩展图标、VSCT 文件和外部工具移动到新文件夹
ImageOptimizer\Resources
。 将它们复制到共享文件夹,并将其从 VSIX 项目中删除。 - 将它们重新添加为链接项,如果项目已经是链接项,则可以保持不变(例如许可证)。
- 通过选择每项并检查属性工具窗口,验证是否在添加的链接文件中正确设置生成操作和其他属性。 为了我们的项目,我们需要设定以下内容:
将
icon.png
生成操作设置为Content
,并将 VSIX 中的“包含”设置为“true
”将
ImageOptimizer.vsct
生成操作设置为VSCTComplile
,并将“VSIX 中包含”设置为false
将
Resources\Tools
下文件的所有生成操作都设置为Content
,并将标记的“VSIX 中包括”设置为true
此外,
ImageOptimizer.cs
是ImageOptimizer.vsct
的依赖项,因此我们必须手动将此依赖项添加到 csproj 文件:- <Content Include="..\SharedFiles\ImageOptimizer.vsct"> - <Link>ImageOptimizer.vsct</Link> - </Content> - <Compile Include="..\SharedFiles\ImageOptimizer.cs"> - <Link>ImageOptimizer.cs</Link> - </Compile> + <VSCTCompile Include="..\SharedFiles\ImageOptimizer.vsct"> + <ResourceName>Menus.ctmenu</ResourceName> + <Generator>VsctGenerator</Generator> + <LastGenOutput>..\SharedFiles\ImageOptimizer.cs</LastGenOutput> + </VSCTCompile> + <Compile Include="..\SharedFiles\ImageOptimizer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>..\SharedFiles\ImageOptimizer.vsct</DependentUpon> + </Compile>
如果属性工具窗口阻止你设置特定的生成操作,则可以按照上述操作手动修改 csproj,并根据需要设置生成操作。
- 对于此项目,我们需要将扩展图标、VSCT 文件和外部工具移动到新文件夹
生成项目以验证更改并修复任何错误/问题。 有关常见问题,请查看 常见问题 部分。
步骤 3 - 添加 Visual Studio 2022 VSIX 项目
向解决方案添加新的 VSIX 项目。
删除新项目中除
source.extension.vsixmanifest.
之外的任何其他源代码添加对共享项目的引用。
从 Visual Studio 2019 VSIX 项目添加链接文件,并验证其“生成操作”和“包含在 VSIX”属性是否匹配。 此外,复制
source.extension.vsixmanifest
文件,稍后我们将对其进行修改以支持 Visual Studio 2022。尝试的生成显示缺少对
System.Windows.Forms
的引用。 只需将其添加到 Visual Studio 2022 项目并重新生成。+ <Reference Include="System.Windows.Forms" />
升级对 Visual Studio 2022 版本的
Microsoft.VisualStudio.SDK
和Microsoft.VSSDK.BuildTools
包引用。备注
这些是本指南创建时可用的最新版本。 建议获取可用的最新版本。
-<PackageReference Include="Microsoft.VisualStudio.SDK" Version="16.0.206" /> +<PackageReference Include="Microsoft.VisualStudio.SDK" Version="17.0.0-preview-1-31216-1036" /> -<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="16.10.32" /> +<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="17.0.63-Visual Studio 2022-g3f11f5ab" />
编辑
source.extension.vsixmanifest
文件以符合面向 Visual Studio 2022 的要求。设置
<InstallationTarget>
标记以反映 Visual Studio 2022 并指示 amd64 有效负载:<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)"> <ProductArchitecture>amd64</ProductArchitecture> </InstallationTarget>
修改先决条件以仅包括 Visual Studio 2022 及更高版本:
- <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[15.0,)" DisplayName="Visual Studio core editor" /> + <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[17.0,)" DisplayName="Visual Studio core editor" />
我们完成了!
这样一来,生成现在会生成 Visual Studio 2019 和 Visual Studio 2022 VSIX。
其他示例
- ProPower 工具
- PeekF1
- 允许查看 Web 浏览器,其中包含有关所选类/对象的帮助信息。
- FixMixedTabs
- 扫描文档,将制表符替换为空格,或将空格替换为制表符
- PeekF1
后续步骤
请阅读此完整流程指南,为更新扩展做好准备。