java .NET C#中的Maven等效项

myzjeezk  于 2023-01-15  发布在  Java
关注(0)|答案(2)|浏览(229)

假设有两个Maven Java项目A和B。A依赖于B。B位于远程Maven存储库和GitHub中。
在IntelliJ Idea IDE中,我将在两个单独的窗口中打开项目A和B(B是从GitHub克隆而来的)。
现在,B有一个名为Car的类。当我在项目A中的Car类上单击“Ctrl+鼠标左键”时,IDE会自动切换到打开的项目B中的源代码。因此,我可以轻松地在A和B上一起工作。
如何使用.NET C#和Visual Studio实现相同的行为?

1zmg4dgp

1zmg4dgp1#

在.NET生态系统中,Maven的大致等价物是NuGet。NuGet文件可以是created,使用IDE或命令行工具,如dotnet packnuget pack。NuGet文件只是扩展名为.nupkg的常规.zip文件。这些文件可以托管在http://www.nuget.org上,供公众使用。在诸如http://www.myget.org的站点上,或者在private hosted NuGet server上。
NuGet工具还可以对包含源代码文件的create debug symbol packages进行调试。调试符号包可以托管在公共或私有符号服务器上,并且可以使用used in Visual Studio来单步调试代码,并在Visual Studio中启用配置选项。
如果您在Visual Studio中打开项目A并启用了automatic package restore,并且该项目与项目B具有package reference,则在生成项目时,它将自动下载项目B的NuGet文件,将其解包到本地NuGet缓存,然后在项目中使用项目B的程序集。
如果Visual Studio是与项目B的确切版本对应的configured correctly to find a debug symbols package,则它将允许调试器单步执行项目B的代码。
AFAIK,打开项目B的代码文件,然后设置断点是不可能的(如果这是错误的,有人会留下注解),您需要在项目A中设置断点,然后当您单步执行到调用/示例化Car类的行时,Visual Studio将打开代码文件,以便您可以单步执行它。

更新日期:2023年1月15日

注意,上面的符号文档仍然有效,但现在有一个更好的方法。如果NuGet包的作者配置了Source Link,并且代码存在于Git仓库中,IDE可以enable source stepping,代码文件可以直接从资源库下载到IDE的调试器中,这意味着不再需要将源文件打包到符号包中。该特性使用Git提交哈希来确保源代码与二进制文件匹配,即使您稍后升级NuGet包也是如此。
通过在项目文件中包含<PropertyGroup><IncludeSymbols>true</IncludeSymbols><SymbolPackageFormat>snupkg</SymbolPackageFormat></PropertyGroup>,符号也已更新为允许.snupkg file。这种新格式可以直接上载到NuGet,而不必使用第三方符号或自托管服务器进行调试。

fruv7luv

fruv7luv2#

嗯,实际上是有可能的。但是需要对MSBuild做一些修改。
前提条件:

  • 使用VS 2017附带的新MSBuild格式

一步一步:

  • 创建解决方案并添加这两个项目
  • 我假设项目A有一个对项目B的包引用,并且nuget包名与项目名相同
  • 在两个项目的根目录(可能不属于任何源代码管理系统)中,创建一个名为Directory.Build.targets的文件,该文件包含以下内容:

<PropertyGroup>
    <SolutionFileContent>$([System.IO.File]::ReadAllText($(SolutionPath)))</SolutionFileContent>
    <SmartSolutionDir>$([System.IO.Path]::GetDirectoryName( $(SolutionPath) ))</SmartSolutionDir>
    <RegexPattern>(?&lt;="[PackageName]", ")(.*)(?=", ")</RegexPattern>
  </PropertyGroup>

  <ItemGroup>

    <!-- Keep the identity of the  packagereference -->
    <SmartPackageReference Include="@(PackageReference)">
      <PackageName>%(Identity)</PackageName>
      <InSolution>$(SolutionFileContent.Contains('\%(Identity).csproj'))</InSolution>
    </SmartPackageReference>

    <!-- Filter them by mapping them to another itemGroup using the WithMetadataValue item function -->
    <PackageInSolution Include="@(SmartPackageReference -> WithMetadataValue('InSolution', True) )">
      <Pattern>$(RegexPattern.Replace('[PackageName]','%(PackageName)') )</Pattern>
      <SmartPath>$([System.Text.RegularExpressions.Regex]::Match( '$(SolutionFileContent)', '%(Pattern)' ))</SmartPath>
    </PackageInSolution>

    <ProjectReference  Include="@(PackageInSolution -> '$(SmartSolutionDir)\%(SmartPath)' )"/>

    <!-- Remove the package references that are now referenced as projects -->
    <PackageReference Remove="@(PackageInSolution -> '%(PackageName)' )"/>
  </ItemGroup>

</When>

这里发生的是,当所有包引用包含在当前打开的解决方案中时,它们会自动动态地替换为项目引用。
有关更多信息,我还在MSBuild github问题中发布了该解决方案:https://github.com/dotnet/sdk/issues/1151

相关问题