Giter Site home page Giter Site logo

slngen's Introduction

SlnGen

Build Status

Overview

SlnGen is a Visual Studio solution file generator. Visual Studio solutions generally do not scale well for large project trees. They are scoped views of a set of projects. Enterprise-level builds use custom logic like traversal to convey how they should be built by a hosted build environment. Maintaining Visual Studio solutions becomes hard because you have to keep them in sync with the other build logic. Instead, SlnGen reads the project references of a given project to create a Visual Studio solution on demand. For example, you can run it against a unit test project and be presented with a Visual Studio solution containing the unit test project and all of its project references. You can also run SlnGen against a traversal project in a rooted folder to open a Visual Studio solution containing that view of your project tree.

Getting Started - .NET Core Global Tool (Recommended)

NuGet package NuGet downloads

To install SlnGen, run the following command:

dotnet tool install --global Microsoft.VisualStudio.SlnGen.Tool --add-source https://api.nuget.org/v3/index.json --ignore-failed-sources

Once installed, .NET Core will add slngen to your PATH so you can run it from any command window:

slngen --help

More documentation is available at https://microsoft.github.io/slngen/.

Getting Started - MSBuild Target

NuGet package NuGet downloads

The MSBuild target must be installed as a NuGet package and restored. This can slow down the process so a .NET Core tool might be preferable.

Install the package to an individual project (not recommended):

 Install-Package Microsoft.VisualStudio.SlnGen

Or add it your Directory.Build.props:

<ItemGroup>
  <PackageReference Include="Microsoft.VisualStudio.SlnGen" Version="<Latest Version>" />
</ItemGroup>

Generate and open a Visual Studio solution with MSBuild:

> MSBuild /Restore /t:SlnGen

You can also create a DOSKEY alias as a shortcut

> doskey slngen=msbuild /nologo /v:m /t:slngen

More documentation is available at https://microsoft.github.io/slngen/.

Contributing

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.

slngen's People

Contributors

afabre avatar amrmahdi avatar brotatotes avatar danmoseley avatar dependabot[bot] avatar dfederm avatar efoleymsft avatar geeknoid avatar icnocop avatar insouciiance avatar jaccus avatar jeffkl avatar johnthcall avatar jp2masa avatar kingerja avatar mcarton avatar mciancia8 avatar michael-hawker avatar microsoft-github-policy-service[bot] avatar mruxmohan4 avatar odhanson avatar oskikervinen-mf avatar portikus avatar pstranak-sw avatar ptasev avatar reetchatha avatar richardsondev avatar russkie avatar viktorhofer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

slngen's Issues

Use relative paths in Solution Files

Right now we use absolute paths in Solution Files to reduce bugs but if people want to check the solution files in they need to contain relative paths.

So let's find a good library/algorithm that can generate relative paths in a reliable way.

Check the "Deploy" box by default in solution configuration.

Is it possible to have SlnGen enable the "Deploy" option in solution configuration for specific projects?

We have some service fabric projects (sfproj) in our repo. When we generate an sln with SlnGen, the "Deploy" option is disabled. When deploying the app to a local cluster (set project as startup, F5), you have to open solution config and check the box every time, which is kind of annoying :(

Allow opening of existing solution

At the moment, existing solution files are overwritten causing Visual Studio to lose its cache. If a solution file exists, the solution GUID should be re-used so that the cache can be used again speeding up solution load.

InvalidOperationException when generating a solution for a single project

The "SlnGen" task failed unexpectedly.
System.InvalidOperationException: Operation is not valid due to the current state of the object.
   at SlnGen.Build.Tasks.Internal.SlnHierarchy.GetRootFolder(IEnumerable`1 projects)
   at SlnGen.Build.Tasks.Internal.SlnHierarchy..ctor(IReadOnlyList`1 projects, Boolean collapseFolders)
   at SlnGen.Build.Tasks.Internal.SlnFile.Save(TextWriter writer, Boolean useFolders)
   at SlnGen.Build.Tasks.Internal.SlnFile.Save(String path, Boolean useFolders)
   at SlnGen.Build.Tasks.SlnGen.GenerateSolutionFile(ICollection`1 projects)
   at SlnGen.Build.Tasks.SlnGen.ExecuteTask()
   at SlnGen.Build.Tasks.TaskBase.Execute()
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()

This is because a single project should not be attempting to generate any hierarchy.

Specify folder name as a solution file customization per project

In the case where --folders <true> is false (or the msbuild property SlnGenFolders), it would be great to be able to specify the solution folder per project similar to how IncludeInSolutionFile works.

That would allow dotnet/runtime to use to slngen to group our projects in the following hierarchy:

  • ref
  • src
  • tests

Have a similar project

ProjectIO reads various Visual Studio project files and probably has version issues with those. It also reads CMake projects and will create Visual Studio solutions for them. It's main purpose is to help feed ASTs (from ClangSharp or Roslyn) into DeepEnds which has used various Microsoft projects on GitHub as test data - typically for deletion of dead code.

Might be worth sharing code but I currently intend to fly abroad on my hols in a few days time so not sure when I'll be able to evaluate your codebase. In the meantime feel free to evaluate ProjectIO if it is of interest.

Generate import for user-specified platform/configuration

Newer versions of the project system in Visual Studio seem to ignore the platform/configuration in the SLN file and instead defer to the values in the project file itself. When a user specifies the platform/configuration as a global property during SLN generation, we emit the values to the SLN. However, Visual Studio can ignore them.

We need to generate a .props file as well and import it in SlnGen.targets. The file should be named something like $(SolutionDir)\$(SolutionFile).slngen.props and each project will import it. That way when Visual Studio evalutes the project, the platform/configuration will be set to exactly what we want.

Related to #11

slngen does not include legacy project types that do not define TargetFramework

Hi,

I am trying to use slngen to generate solution files for projects that take reference on legacy/older project types where TargetFramework is not defined.

However, I found that slngen is filtering these projects because there is no TargetFramework defined:

(string solutionFileFullPath, int customProjectTypeGuidCount, int solutionItemCount, Guid solutionGuid) = SlnFile.GenerateSolutionFile(arguments, projectCollection.LoadedProjects.Where(i => !i.GlobalProperties.ContainsKey("TargetFramework")), forwardingLogger);

There also is no way to change this behavior through an argument. It seems like slngen should have an opt out flag for this type of filtering or a way to specify which properties to filter on.

Using SlnGenSolutionFileFullPath does not create folders if they don't exist

I want to use SlnGenSolutionFileFullPath to put all my generated solution files in one place. To achieve this I have this property in my global properties:

  <PropertyGroup>
    <SlnGenSolutionFileFullPath>$(MSBuildThisFileDirectory).sln\$(MSBuildProjectName).sln</SlnGenSolutionFileFullPath>
    <SlnGenFolders>true</SlnGenFolders>
  </PropertyGroup>

However, when I run it, it spits out this error:

F:\Fx\Main [master โ‰ก +1 ~1 -0 !]
ฮป  slngen .\Product\Tests\Framework\
Microsoft (R) Build Engine version 15.7.180.61344 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

  Loading project references...
  Generating Visual Studio solution "F:\Fx\Main\.sln\dirs.sln" ...
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018: The "SlnGen" task failed unexpectedly. [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018: System.IO.DirectoryNotFoundException: Could not find a part of the path 'F:\Fx\Main\.sln\dirs.sln'. [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromPr oxy, Boolean useLongPath, Boolean checkHost) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) [F:\Fx\Main\Produ ct\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.StreamWriter..ctor(String path, Boolean append) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.File.CreateText(String path) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at SlnGen.Build.Tasks.Internal.SlnFile.Save(String path, Boolean folders) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at SlnGen.Build.Tasks.SlnGen.GenerateSolutionFile(ICollection`1 projects) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at SlnGen.Build.Tasks.SlnGen.ExecuteTask() [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at SlnGen.Build.Tasks.TaskBase.Execute() [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() [F:\Fx\Main\Product\Tests\Framework\dirs.proj]

Build FAILED.

C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018: The "SlnGen" task failed unexpectedly. [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018: System.IO.DirectoryNotFoundException: Could not find a part of the path 'F:\Fx\Main\.sln\dirs.sln'. [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromPr oxy, Boolean useLongPath, Boolean checkHost) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) [F:\Fx\Main\Produ ct\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.StreamWriter..ctor(String path, Boolean append) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at System.IO.File.CreateText(String path) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at SlnGen.Build.Tasks.Internal.SlnFile.Save(String path, Boolean folders) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at SlnGen.Build.Tasks.SlnGen.GenerateSolutionFile(ICollection`1 projects) [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at SlnGen.Build.Tasks.SlnGen.ExecuteTask() [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at SlnGen.Build.Tasks.TaskBase.Execute() [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
C:\Users\pachun\.nuget\packages\slngen\2.1.3\build\SlnGen.targets(25,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() [F:\Fx\Main\Product\Tests\Framework\dirs.proj]
    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:05.05                                                                                                                                                                                                                                                                                                           ```

When I create the .sln folder, it works. It should create folders that don't exist in the path.

Add an option to search for projects in subdirectories as well

It would be great if we could leverage slngen to keep our solution files up-to-date dotnet/runtime in which we have the following project hierarchy:

- System.Runtime.Serialization.Formatters
  - ref
      System.Runtime.Serialization.Formatters.csproj
  - src
      System.Runtime.Serialization.Formatters.csproj
  - tests
      System.Runtime.Serialization.Formatters.Tests.csproj

By default slngen only searches for project files in the current directory if one isn't specified. Can we change this so that it searches for project files in subdirectories as well either by default or under a switch?

Note that we would probably need multiple entry points here as we don't have a clear dependency chain yet between ref, src and test projects.

cc @jeffkl

NullReferenceException in SlnProject constructor

System.ArgumentNullException: Value cannot be null.
Parameter name: projectTypeGuid
 at SlnGen.Build.Tasks.Internal.SlnProject..ctor(String fullPath, String name, String projectGuid, String projectTypeGuid, Boolean isMainProject)

SDK-style projects are added as legacy project type guids

This causes VS to (incorrectly) attempt to fix the project and not handle it correctly as it thinks it's a legacy projects type instead of using CPS.

For SDK-style C# projects, it needs project type GUID 9A19103F-16F7-4668-BE54-9A1E7A4F7556 instead of FAE04EC0-301F-11D3-BF4B-00C04F79EFBC

Supporting mixed configuration solutions

Hi,

Does slngen support projects with mixed configuration? For example, I have a top level project that is Platform=x86 but within the dependency tree there are also projects with Platform=AnyCPU. When I run slngen on this top level project, my desired behavior would be the top level solution Configuration|Platform be Debug|Mixed, and the individual projects Configuration/Platform be either Debug|Any CPU or Debug|Win32, depending on the projects supported ProjectConfiguration.

So I want something like this:

image

Note that top level solution Configuration in the picture below is AnyCPU and not Mixed, but my point is the same.

With my experiments so far, I see slngen has --platform and --configuration arguments, but they do not achieve the desired behavior.

When I use slngen now on my project with default parameters, Visual Studio complains about incorrect configuration mappings because the generated solution file does not know some projects should have Win32 as their Platform: slngen just assumes every project must be the same as the solution Platform, which by default is AnyCPU. So when Visual Studio loads, if a project has no match, I think Visual Studio is just picking the settings from the project's first listed ProjectConfiguration which results in this:

image

I actually need to go in and save the configuration mappings so Visual Studio auto updates the solution file to be correct.

Add flag to prevent ActiveCfg lines in solution file

While working on my project, I ran into an issue where some projects where stuck in Release configuration even though the global config was debug.
Even after going into configuration manager and switching from release to debug, the change didn't stick, so if I immediately opened config manager, the projects where back in Release instead of debug.
Only after modifying the sln file and removing all the ActivceCfg lines I was able to have the configuration changes stick.
This is in VS2019.

Solution with a mix of .Net Standard and .Net Framework causes VS 2019 to hang

Using version 2.2.27 of SlnGen the solution generated causes VS to hang. I have reported the hang to the VS team here

I later found that by removing the .Net Standard libraries from the solution file I was able to open solution and manually add the libraries reorders the solution and causes it to load properly on cold start. Attached the solution file that works and the one that is generated. I am MSFT internal so let me know if you want me to share the repository and branch as a repro.

solutionFiles.zip

Slngen target for new style SDK does not work

Running msbuild /t:SlnGen on a new style SDK csproj file does not work. Prompts with error:

Microsoft (R) Build Engine version 15.7.179.6572 for .NET Framework                                                                          
Copyright (C) Microsoft Corporation. All rights reserved.                                                                                    
                                                                                                                                             
Build started 29/05/2018 2:33:03 PM.                                                                                                         
Project "C:\Dev\Fx\Main_git\Product\Source\Containers\Container\Container.csproj" on node 1 (SlnGen target(s)).                              
C:\Dev\Fx\Main_git\Product\Source\Containers\Container\Container.csproj : error MSB4057: The target "SlnGen" does not exist in the project.  
Done Building Project "C:\Dev\Fx\Main_git\Product\Source\Containers\Container\Container.csproj" (SlnGen target(s)) -- FAILED.                
                                                                                                                                             
                                                                                                                                             
Build FAILED.                                                                                                                                
                                                                                                                                             
"C:\Dev\Fx\Main_git\Product\Source\Containers\Container\Container.csproj" (SlnGen target) (1) ->                                             
  C:\Dev\Fx\Main_git\Product\Source\Containers\Container\Container.csproj : error MSB4057: The target "SlnGen" does not exist in the project.
                                                                                                                                             
    0 Warning(s)                                                                                                                             
    1 Error(s)                                                                                                                               

Solution file generation for multiple projects inside a Cake-Build Script

Our current build process is initially generating a solution file set of projects (entry points). That is, because our developers are developing in smaller solutions to keep the load times etc. decent. But during build we want to merge all our projects together and build one big solution.

That's why we create a CreateSln.ps1-PowerShell-Script for this task. Our build script begins by calling this script. The script will get a configuration file, where we listed all our "entry points" and will resolve and add all project references. When that is done, all *Test-projects and dependencies will also be added.

Our main problem currently is that the solution file is not a 100% conform to the standards and whenever we open it in Visual Studio, a lot of stuff is automatically changed by Visual Studio again, especially some project related guids.


Now that I have already talked a lot, let's get to my point: Right now we are looking for an alternative and I was wondering if this tool might fit our needs. Taking a quick glance into the documentation, unfortunately I cannot see any possibility to generate a solution file for not one but many project, is there a way?

Further more I would like to know: We would like to initiate the "solution generation" somewhere in our build script. Currently our build process is based on "Cake Build". We can reference the nuget package in our cake script, but I am not sure yet, how we would get the tool to run.

Custom solution hierarchy

This project is really good, but I think that the generated solution is too complex.

The main problem is that projects should be grouped by folder, not project file, it's too hard to navigate on a solution where all projects are placed under a folder with the same name for no good reason...

It would also be good to be able to specify a custom path for projects, probably using some property on the project, and solution items, probably as item metadata.

Something like:

<Project ...>
    ...
    <PropertyGroup>
        <SlnGenHierarchyPath>Tests\</SlnGenHierarchyPath>
    </PropertyGroup>
    ...
</Project>

and

<Project ...>
    ...
    <ItemGroup>
        <SlnGenSolutionItem Include="build\Targets\**" HierarchyPath="Solution Items\build\Targets\" />
    </ItemGroup>
    ...
</Project>

Is this currently possible? If not, I can help implementing this.

Folder structure is ignored by root project

Hi,

I'am using the following command parameters:

slngen --folders:true --solutionfile:.\MySolution.sln .\Folder1\Folder2\SomeProject\SomeProject.csproj
See repro.cmd in attached repro: Repro.zip

I would expect that all project are sorted under SolutionFolders, but as you can see in the attached image the root project is not under any folder. Is this a bug or a not supported feature?

image

Thank you for your Help

Failed to find .NET Core when SDK defined in a global.json is not installed

Where running slngen, we get the following error:

C:\PQExcel>slngen
SlnGen version 3.4.12+13756af45d for .NET Core
Copyright (c) Microsoft Corporation.  Licensed under the MIT license.


Failed to find .NET Core

Running dotnet --info produces:

C:\PQExcel>dotnet --info
A compatible installed .NET Core SDK for global.json version [3.1.202] from [C:\PQExcel\global.json] was not found
Install the [3.1.202] .NET Core SDK or update [C:\PQExcel\global.json] with an installed .NET Core SDK:
  2.1.104 [C:\Program Files\dotnet\sdk]
  2.1.201 [C:\Program Files\dotnet\sdk]
  2.1.202 [C:\Program Files\dotnet\sdk]
  2.1.504 [C:\Program Files\dotnet\sdk]
  2.1.700 [C:\Program Files\dotnet\sdk]
  3.1.302 [C:\Program Files\dotnet\sdk]

 

Host (useful for support):
  Version: 3.1.6
  Commit:  3acd9b0cd1

 

.NET Core SDKs installed:
  2.1.104 [C:\Program Files\dotnet\sdk]
  2.1.201 [C:\Program Files\dotnet\sdk]
  2.1.202 [C:\Program Files\dotnet\sdk]
  2.1.504 [C:\Program Files\dotnet\sdk]
  2.1.700 [C:\Program Files\dotnet\sdk]
  3.1.302 [C:\Program Files\dotnet\sdk]

 

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.11 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.11 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.0.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.0.7 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.11 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 3.1.6 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

 

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download
 

Slngen was installed using the 3.1.302 SDK, and should not fail due to am invalid SDK in global.json, or at least provide a better error message

slngen target multiple folders

Hi,
I'd like to slngen multiple test csproj and there are placed in multiple different folders.
it looks there is no cmdlet flag to control this behavior, I have to add a dummy csproj to include all test projects.

ProjectReference search isn't respecting inner builds

When conditioning IncludeInSolutionFile based on a project's TargetFramework, the project is still included which makes me believe that only a project's outer build is analyzed.

This is causing problems when ProjectReferences are centrally defined conditionally included based on the TargetFramework.

@jeffkl can you confirm that assumption?

Throw away a folder from the hierarchy if it only has one child which is a project

Usually a project file and its source code exists a separate folder, like

a
->b/b.csproj
->c/c.csproj

current behavior includes folder b and c in the hierarchy. I suggest to throw away the folder which only has one child who is a project, proposed layout:

a
->b.csproj
->c.csproj

we can either change the current behavior, or control this via a flag.

Need support for .scopeproj

.scopeproj is a Microsoft internal only SDK with a project type GUID of 202899A3-C531-4771-9089-0213D66978AE and project GUID either in the project or can be generated

Solution filter file support

It would be great if slngen would support solution filter file as an output as well (slnfgen ๐Ÿ˜). That would help with only having a single repo wide solution file and per leaf solution filter files that reference the solution file.

SlnGen crashes in MSBuild 15

We're using a constructor overload that was added in MSBuild 16 which causes a MissingMethodException

System.MissingMethodException
  HResult=0x80131513
  Message=Method not found: 'Void Microsoft.Build.Evaluation.ProjectCollection..ctor(System.Collections.Generic.IDictionary`2<System.String,System.String>, System.Collections.Generic.IEnumerable`1<Microsoft.Build.Framework.ILogger>, System.Collections.Generic.IEnumerable`1<Microsoft.Build.Logging.ForwardingLoggerRecord>, Microsoft.Build.Evaluation.ToolsetDefinitionLocations, Int32, Boolean, Boolean)'.
  Source=slngen
  StackTrace:
   at Microsoft.VisualStudio.SlnGen.Program.OnExecute()
   at McMaster.Extensions.CommandLineUtils.Conventions.ExecuteMethodConvention.Invoke(MethodInfo method, Object instance, Object[] arguments)
   at McMaster.Extensions.CommandLineUtils.Conventions.ExecuteMethodConvention.<OnExecute>d__1.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at McMaster.Extensions.CommandLineUtils.Conventions.ExecuteMethodConvention.<>c__DisplayClass0_0.<<Apply>b__0>d.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at McMaster.Extensions.CommandLineUtils.CommandLineApplication.<ExecuteAsync>d__160.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at McMaster.Extensions.CommandLineUtils.CommandLineApplication.<ExecuteAsync>d__191`1.MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at McMaster.Extensions.CommandLineUtils.CommandLineApplication.Execute[TApp](CommandLineContext context)
   at McMaster.Extensions.CommandLineUtils.CommandLineApplication.Execute[TApp](IConsole console, String[] args)
   at Microsoft.VisualStudio.SlnGen.Program.Main(String[] args)

We should compile against net46 and MSBuild 15 to ensure we won't hit runtime exceptions

Slngen doesn't work with some .vcxproj projects

The following .vcxproj project does not generate a building solution:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <VCProjectVersion>16.0</VCProjectVersion>
    <ProjectGuid>{9DDEB256-6A03-48BB-9318-4A0E4642C031}</ProjectGuid>
    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup>
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <CharacterSet>Unicode</CharacterSet>
    <PlatformToolset>v142</PlatformToolset>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)'=='Debug'">
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)'=='Release'">
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

image

If I remove these lines, slngen will create a building solution

  <PropertyGroup Condition="'$(Configuration)'=='Debug'">
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)'=='Release'">
  </PropertyGroup>

image

Failed to find .NET Core SDK

I get the following error on running slngen :

E:\H>slngen
SlnGen version 3.4.15+9599977c51 for .NET Core
Copyright (c) Microsoft Corporation.  Licensed under the MIT license.

Failed to find .NET Core.  Run dotnet --info for more information.

This is what I get on running dotnet --info:

E:\H>dotnet --info
.NET Core SDK (reflecting any global.json):
 Version:   3.1.302
 Commit:    41faccf259

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.19041
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\3.1.302\

Host (useful for support):
  Version: 3.1.6
  Commit:  3acd9b0cd1

.NET Core SDKs installed:
  2.1.202 [C:\Program Files\dotnet\sdk]
  2.1.503 [C:\Program Files\dotnet\sdk]
  2.1.509 [C:\Program Files\dotnet\sdk]
  2.1.511 [C:\Program Files\dotnet\sdk]
  2.1.512 [C:\Program Files\dotnet\sdk]
  2.1.513 [C:\Program Files\dotnet\sdk]
  2.1.514 [C:\Program Files\dotnet\sdk]
  2.1.515 [C:\Program Files\dotnet\sdk]
  2.1.516 [C:\Program Files\dotnet\sdk]
  2.1.801 [C:\Program Files\dotnet\sdk]
  2.2.401 [C:\Program Files\dotnet\sdk]
  3.0.103 [C:\Program Files\dotnet\sdk]
  3.1.302 [C:\Program Files\dotnet\sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.12 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.16 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.18 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.19 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.12 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.16 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.18 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.19 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.0.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.12 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.13 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.15 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.16 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.17 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.18 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.19 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.0.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 3.0.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.6 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

This contains no information about what the issue is.
What can I do to fix this issue?

System.PlatformNotSupportedException: Accessing a hash algorithm

I am still seeing the issue #145 happening in the latest Microsoft.VisualStudio.SlnGen.Tool. If there is no instance of visual studio 2019 running and I use slngen to open a project built on net46(also tried on project built on net472) then I see the following error:
Unhandled exception. System.AggregateException: One or more errors occurred. (Accessing a hash algorithm by manipulating the HashName property is not supported on this platform. Instead, you must instantiate one of the supplied subtypes (such as HMACSHA1.))
---> System.PlatformNotSupportedException: Accessing a hash algorithm by manipulating the HashName property is not supported on this platform. Instead, you must instantiate one of the supplied subtypes (such as HMACSHA1.)
at System.Security.Cryptography.HMAC.HashCore(Byte[] rgb, Int32 ib, Int32 cb)
at System.Security.Cryptography.HashAlgorithm.ComputeHash(Byte[] buffer)
at Microsoft.VisualStudio.ApplicationInsights.Channel.Transmission.HashContent(Byte[] content)
at Microsoft.VisualStudio.ApplicationInsights.Channel.Transmission.get_ContentHash()
at Microsoft.VisualStudio.ApplicationInsights.Channel.StorageTransmission.ToString()
at System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)
at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args)
at System.String.Format(IFormatProvider provider, String format, Object arg0, Object arg1)
at Microsoft.VisualStudio.ApplicationInsights.Channel.Sender.SendAsync(StorageTransmission transmission, CancellationToken token, TimeSpan sendInterval)
at Microsoft.VisualStudio.ApplicationInsights.Channel.Sender.<>c__DisplayClass20_1.<b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.VisualStudio.ApplicationInsights.Channel.Sender.FlushAll(CancellationToken token)
at Microsoft.VisualStudio.ApplicationInsights.Channel.PersistenceTransmitter.Flush(CancellationToken token)
at Microsoft.VisualStudio.ApplicationInsights.Channel.PersistenceChannel.FlushAndTransmitAsync(CancellationToken token)
at Microsoft.VisualStudio.ApplicationInsights.TelemetryClient.FlushAndTransmitAsync(CancellationToken token)
at Microsoft.VisualStudio.Telemetry.SessionChannel.BaseAppInsightsClientWrapper.DisposeAndTransmitAsync(CancellationToken token)
at Microsoft.VisualStudio.Telemetry.SessionChannel.BaseAppInsightsSessionChannel.DisposeAndTransmitAsync(CancellationToken token)
at Microsoft.VisualStudio.Telemetry.EventProcessorRouter.DisposeAndTransmitAsync(CancellationToken token)
at Microsoft.VisualStudio.Telemetry.EventProcessorContext.DisposeAndTransmitAsync(CancellationToken token)
at Microsoft.VisualStudio.Telemetry.EventProcessor.DisposeAndTransmitAsync(CancellationToken token)
at Microsoft.VisualStudio.Telemetry.SessionChannel.EventProcessorChannel.DisposeAndTransmitAsync(CancellationToken token)
at Microsoft.VisualStudio.Telemetry.TelemetrySession.DisposeToNetworkAsync(CancellationToken token)
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait(TimeSpan timeout)
at Microsoft.VisualStudio.SlnGen.TelemetryClient.Dispose() in C:\A_work\107\s\src\Microsoft.VisualStudio.SlnGen\TelemetryClient.cs:line 48
at Microsoft.VisualStudio.SlnGen.Program.Main(String[] args) in C:\A_work\107\s\src\Microsoft.VisualStudio.SlnGen\Program.cs:line 253

Traversal project solution does not contain traversed projects

I have the following file at the root of my repo:

<Project Sdk="Microsoft.Build.Traversal">
  <PropertyGroup>
    <TraversalGlobalProperties>IsTraversal=true</TraversalGlobalProperties>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="src/core/**/*.csproj" />
  </ItemGroup>
</Project>

From a VS 2019 (16.5.4) dev CLI I run:

  1. dotnet tool install --global Microsoft.VisualStudio.SlnGen.Tool
  2. del core.sln && slngen

Output (I replaced some actual paths on my machine with XXX):

SlnGen version 3.2.2+aca281b938 for .NET Core
Copyright (c) Microsoft Corporation. Licensed under the MIT license.

Build started 20/4/2020 13:37:41.
Searching "XXX" for projects
Generating solution for project "XXX\core.proj"
Loading project references...
Loaded 39 project(s) in 4,652ms
Generating Visual Studio solution "XXX\core.sln" ...
Launching Visual Studio...

The ProjectReference pattern in the root traversal project pasted above (src/core/**/*.csproj) indeed matches 39 csproj files so the logs look good. However the resulting solution file contains only the root traversal project (which VS can't even open):

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YYY", "XXX\core.proj", "{76806E8F-D597-4557-B2D1-0BF9349D794A}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {7290F1A9-C282-446D-8011-602F828E1729}
	EndGlobalSection
EndGlobal

PlatformNotSupportedException

Got a PlatformNotSupportedException thrown trying to use this tool. The actual error text was:

Accessing a hash algorithm by manipulating the HashName property is not supported on this platform. Instead, you must instantiate one of the supplied subtypes (such as HMACSHA1.)

The project was created in Ubuntu WSL1 using dotnet new console, but the slgen was run from Powershell Core in Windows. The version of dotnet in both cases was 3.1.301. It did seem to create a valid solution file that was open-able in VS2019 16.6.2

Install fails to retrieve the NuGet package

I'm seeing the following error when trying to install the tool:

C:\WINDOWS\system32>dotnet tool install --interactive --global Microsoft.VisualStudio.SlnGen.Tool
  Determining projects to restore...
C:\Program Files\dotnet\sdk\3.1.301\NuGet.targets(128,5): error : Unable to load the service index for source https://1essharedassets.pkgs.visualstudio.com/_packaging/Kusto/nuget/v3/index.json. [C:\Users\zivc\AppData\Local\Temp\0updno2j.ciy\restore.csproj]
C:\Program Files\dotnet\sdk\3.1.301\NuGet.targets(128,5): error :   Response status code does not indicate success: 401 (Unauthorized). [C:\Users\zivc\AppData\Local\Temp\0updno2j.ciy\restore.csproj]
The tool package could not be restored.
Tool 'microsoft.visualstudio.slngen.tool' failed to install. This failure may have been caused by:

* You are attempting to install a preview release and did not use the --version option to specify the version.
* A package by this name was found, but it was not a .NET Core tool.
* The required NuGet feed cannot be accessed, perhaps because of an Internet connection problem.
* You mistyped the name of the tool.

For more reasons, including package naming enforcement, visit https://aka.ms/failure-installing-tool

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.