标签: code-generation

如何在 git 子模块中组织多个协议缓冲区文件?

我使用 git-submodules 在多个项目之间共享 .proto 文件。

现在我的问题是如何正确设置导入?

在微服务环境中,所有服务存储库都有一个包含共享 .proto 文件的 git-submodule:

  • git.dev/fooservice​
    • proto(包含git.dev/proto子模块)
    • ...一些java代码
  • git.dev/barservice​
    • proto(包含git.dev/proto子模块)
    • ...一些 go 代码
  • git.dev/bazservice​
    • proto(包含git.dev/proto子模块)
    • ...一些 JavaScript 代码
  • git.dev/原型
    • 共享
      • 共享原型
    • 餐饮服务
      • fooservice.proto(导入shared/shared.proto)
    • 酒吧服务
      • barservice.proto(导入shared/shared.proto)

目前,服务原型文件的典型标头如下所示:

git.dev/proto/fooservice/fooservice.proto

syntax = "proto3";

package abc.foo;

import "shared/shared.proto";

option go_package = "foopb";
option java_multiple_files = true;
option java_outer_classname = "FooProto";
option java_package  = "com.abc.foo";
Run Code Online (Sandbox Code Playgroud)

问题一:导入路径

  • 让它import "shared/shared.proto";适用于 git.dev/proto 存储库的 linting ,但会在代码生成期间导致导入问题。
  • 让它 …

import code-generation path protocol-buffers git-submodules

6
推荐指数
0
解决办法
2471
查看次数

dotnet aspnet-codegenerator 工具未找到 Microsoft.VisualStudio.Web.CodeGeneration.Design

我刚刚使用dotnet new mvc --name test-project( netcoreapp3.1) 创建了一个 MVC 应用程序,没有任何类型的数据库访问和身份,我想手动添加以用于自定义目的。然后我添加了一些包以便使用该dotnet aspnet-codegenerator工具。我的.csproj看起来像这样:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>test_project</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.4" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.7" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.7" />
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.7" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.7">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.7">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.Design" Version="1.1.0" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这Microsoft.VisualStudio.Web.CodeGeneration.Design是列表中的第一个。但是,当我尝试从该dotnet …

c# code-generation .net-core asp.net-core asp.net-core-scaffolding

6
推荐指数
1
解决办法
1万
查看次数

在针对消费者代码的 NuGet 库中使用源生成器

我正在尝试使用新的源生成器将许多运行时反射内容转移到 AOT,但是我面临一些问题。我先说一下我的要求。

  • 该库的代码需要针对 .NET 5,但不是针对源生成器本身,尽管拥有它会很好,但根据MS 开发博客,这还不可能。
  • 源生成器本身不需要与原始 NuGet 包分开安装。

现在来看一个更直观的示例,假设包 A 是 NuGet 库,它应该包含包 A 的用户的代码。包 B,包含源生成器的包,它再次应该在用户代码库上执行,而不是在包裹 A。包裹 B 应与包裹 A 一起运输。

为什么随库一起提供源生成器如此重要?SG 将生成库本身所需的代码。

我在阅读文档时可能跳过了一些内容,但是我无法弄清楚,假设这甚至是可能的。

c# code-generation c#-8.0

6
推荐指数
1
解决办法
954
查看次数

Kotlinpoet:从生成的类型和属性中省略冗余的“public”修饰符

有什么方法可以省略public通过 KotlinPoetTypeSpec.Builder和PropertySpec.Builder分别生成的类型和属性中的冗余修饰符吗?

code-generation kotlin kotlinpoet

6
推荐指数
2
解决办法
1583
查看次数

Maven中如何处理生成源的依赖关系?

在过去的几天里,我一直在尝试使用openapi-generator-maven-plugin. 然而,compile当 Maven 意识到生成的代码刚刚引入的第三方依赖项尚未解决时,它就会在 -Phase 中失败。由于代码生成本身有效,我的问题似乎相当普遍,并且与生成代码后发生的情况有关。

这是一个示例 POM,其中包含有关如何设置插件的自述文件的复制粘贴内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>openapi-generator-maven-plugin-error-demo</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.openapitools</groupId>
        <artifactId>openapi-generator-maven-plugin</artifactId>
        <!-- RELEASE_VERSION -->
        <version>5.0.0</version>
        <!-- /RELEASE_VERSION -->
        <executions>
          <execution>
            <goals>
              <goal>generate</goal>
            </goals>
            <configuration>
              <inputSpec>https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/petstore.json</inputSpec>
              <generatorName>java</generatorName>
              <configOptions>
                <sourceFolder>src/gen/java/main</sourceFolder>
              </configOptions>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>
Run Code Online (Sandbox Code Playgroud)

运行mvn clean compile应该会生成源代码,而且确实如此。然而,一旦maven-compiler-plugin生成代码后立即启动,它就会在生成的代码中看到新引入的包和符号引用,从而失败。

所以我试图弄清楚如何在生成之后、编译之前安装所述依赖项,但完全失败了。我怀疑我需要使用 maven-depndcies-plugin,但由于我对 Maven 的了解有限,而且对其插件如何工作的了解更有限,我完全迷失了。我尝试将其添加maven-dependency-plugin到我的 POM 中,但 Maven 完全忽略它并且根本不运行它。我尝试将resolve目标与compile阶段绑定,但没有成功。

我本以为 …

java code-generation maven

6
推荐指数
0
解决办法
1645
查看次数

在 Unity 2020.2 中使用 Roslyn 代码生成器

长话短说

  • 如何从 Unity 引用自定义 Roslyn 代码生成器?
    • 当地“传统”项目的可靠性如何?
    • 如何在Unity中引用“传统”dotnet项目?
  • 我可以将 Roslyn 代码生成器制作为 Unity 包或至少制作为 asmdef 吗?如何制作?我该如何使用它?

深入

我计划在 Unity 项目中使用自定义 Roslyn 代码生成器。

我找到了有关如何使用 正确设置代码生成器的信息CodeGeneration.Roslyn。通过此设置,可以轻松将代码生成器导出为 NuGet 包并将其导入到任何其他项目中。

第一个问题是通过这样的 NuGet 包生成代码是否可以在Unity 2020.2 LTS下工作。我想知道在 Unity 项目中实现如下所示的 MSBuild 项目引用有多麻烦。我想避免自己尝试这个,因为它可能根本不起作用,但在等待答案时我无论如何都会这样做:

<ItemGroup>
    <PackageReference Include="CodeGeneration.Roslyn.Tool" Version="0.7.63">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers;buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    
    <!-- This ProjectReference to the generator needs to have the OutputItemType metadata -->
    <ProjectReference Include="..\Duplicator.Generators\Duplicator.Generators.csproj"
                      ReferenceOutputAssembly="false"
                      SetTargetFramework="TargetFramework=net4.7.2"
                      OutputItemType="CodeGenerationRoslynPlugin" />

    <ProjectReference Include="..\Duplicator.Attributes\Duplicator.Attributes.csproj"
                      ExcludeAssets="runtime"
                      SetTargetFramework="TargetFramework=net4.7.2"
                      PrivateAssets="all" />
    
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是代码生成器将不在 Unity 项目内。NuGet 导出间接性将使调试生成器变得更加困难。

因此,第二个想法是 …

code-generation unity-game-engine roslyn

6
推荐指数
0
解决办法
2243
查看次数

C# 源代码生成器:如何调试生成代码中的编译器错误?

我正在尝试使用C# 源生成器。我花了大约一天的时间,我发现这是一次非常令人沮丧和痛苦的经历。IntelliSense 极其不可靠。它偶尔会起作用,但大多数情况下不会起作用,而且我无法找出任何系统。(重新启动 Visual Studio 没有帮助。)

但更根本的是,我在调试生成的代码中的错误时遇到了很大的麻烦。当我在源生成器中的模板中犯错误并尝试编译时,我可能会在生成的文件中收到诸如“方法必须有返回类型”之类的错误。但是当我双击错误时,它不会将我带到生成的代码。这使得很难看出它出了什么问题。

有什么窍门吗?当编译失败时,有什么方法可以检查生成的代码吗?更一般地说,生成的代码何时可用于 IntelliSense,何时不可用,由什么决定?

我使用的是 Visual Studio Professional 2022 版本 17.1.6 和 ReSharper 2022.1。

提前致谢!

c# code-generation visual-studio sourcegenerators

6
推荐指数
1
解决办法
2837
查看次数

任何人都有从MSBuild调用Rake获取代码和其他好处的经验吗?怎么回事?你有什么想法/建议?

使用Visual Studio 2008在C#中编程时,我经常希望"自动"生成代码.如果可能的话,我想通过让我的MSBuild解决方案文件调用Rake来实现它,Rake会调用Ruby代码来生成代码,生成的文件会自动出现在我的解决方案中.

这是一个业务示例(我可以命名的许多可能的示例),这种自动代码生成会有所帮助.在最近的一个项目中,我有一个包含一些包含美元金额的属性的界面.我想要第二个接口和第三个接口,它们具有与第一个接口相同的属性,除了它们是"合格"的业务单元名称.像这样的东西:

public interface IQuarterlyResults
{
     double TotalRevenue { get; set; }
     double NetProfit { get; set; }
}

public interface IConsumerQuarterlyResults
{
     double ConsumerTotalRevenue { get; set; }
     double ConsumerNetProfit { get; set; }
}

public interface ICorporateQuarterResults
{
     double CorporateTotalRevenue { get; set; }
     double CorporateNetProfit { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,有一个"消费者业务部门"和一个"公司业务部门".IQuarterlyResults上的每个属性都成为ICorporateQuarterlyResults上名为"Corporate"+ [property name]的属性,同样也是IConsumerQuarterlyResults的属性.

为什么要为这些接口创建接口,而不仅仅是为Consumer提供IQuarterlyResults的实例,为Corporate提供另一个实例?因为,在使用我正在构建的计算器对象时,用户必须处理100个属性,如果他可以处理"完全限定"的属性名称(例如"ConsumerNetProfit"),那就不那么容易混淆了.

但是,在这个例子中,我们不要陷入困境.这只是一个例子而不是主要问题.

主要问题是:我喜欢使用Ruby和ERB来生成代码,我喜欢使用Rake来管理任务之间的依赖关系.为了解决上面的问题,我想做的是让MSBuild调用Rake,并让Rake/Ruby读取"核心"接口上的属性列表,然后生成代码以生成所有相关接口及其属性.每次进行构建时都会触发这个,因为我将它放入VS.NET解决方案的MSBuild文件中.

有没有人尝试过这样的事情?它是如何为你工作的?您可以分享哪些见解,包括优缺点,成功秘诀等等?

谢谢!

c# ruby msbuild rake code-generation

5
推荐指数
1
解决办法
923
查看次数

在C#中动态生成委托类型

我们需要动态生成委托类型.我们需要根据输入参数和输出生成委托.输入和输出都是简单类型.

例如,我们需要生成

int Del(int, int, int, string)
Run Code Online (Sandbox Code Playgroud)

和

int Del2(int, int, string, int)
Run Code Online (Sandbox Code Playgroud)

任何关于如何开始这方面的指示都会非常有帮助.

我们需要解析表示为xml的表达式.

例如,我们将(a + b)表示为

<ADD>
    <param type="decimal">A</parameter>
    <param type="decimal">B</parameter>
</ADD>
Run Code Online (Sandbox Code Playgroud)

我们现在希望将其暴露为Func<decimal, decimal, decimal>.我们当然希望允许xml中的嵌套节点,例如:

(a + b) + (a - b  * (c - d)))
Run Code Online (Sandbox Code Playgroud)

我们希望使用表达式树和Expression.Compile.

欢迎就这种方法的可行性提出建议.

c# delegates code-generation

5
推荐指数
1
解决办法
6632
查看次数

有人知道用于从xsd生成类的任何T4模板吗?

我正在研究一些更新xsds生成的类的工作.我认为这将很好地利用T4模板,但我没有看到任何人这样做的例子.基本上,我想做Linq到XSD所做的事情,但没有在生产解决方案中包含alpha构建目标.

那里有相关的链接吗?


现在是维基.在此处存储您的相关答案.

.net t4 xsd code-generation

5
推荐指数
1
解决办法
3361
查看次数