我使用 git-submodules 在多个项目之间共享 .proto 文件。
现在我的问题是如何正确设置导入?
在微服务环境中,所有服务存储库都有一个包含共享 .proto 文件的 git-submodule:
git.dev/proto子模块)git.dev/proto子模块)git.dev/proto子模块)shared/shared.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 ,但会在代码生成期间导致导入问题。我刚刚使用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
我正在尝试使用新的源生成器将许多运行时反射内容转移到 AOT,但是我面临一些问题。我先说一下我的要求。
现在来看一个更直观的示例,假设包 A 是 NuGet 库,它应该包含包 A 的用户的代码。包 B,包含源生成器的包,它再次应该在用户代码库上执行,而不是在包裹 A。包裹 B 应与包裹 A 一起运输。
为什么随库一起提供源生成器如此重要?SG 将生成库本身所需的代码。
我在阅读文档时可能跳过了一些内容,但是我无法弄清楚,假设这甚至是可能的。
有什么方法可以省略public通过 KotlinPoetTypeSpec.Builder和PropertySpec.Builder分别生成的类型和属性中的冗余修饰符吗?
在过去的几天里,我一直在尝试使用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阶段绑定,但没有成功。
我本以为 …
我计划在 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 导出间接性将使调试生成器变得更加困难。
因此,第二个想法是 …
我正在尝试使用C# 源生成器。我花了大约一天的时间,我发现这是一次非常令人沮丧和痛苦的经历。IntelliSense 极其不可靠。它偶尔会起作用,但大多数情况下不会起作用,而且我无法找出任何系统。(重新启动 Visual Studio 没有帮助。)
但更根本的是,我在调试生成的代码中的错误时遇到了很大的麻烦。当我在源生成器中的模板中犯错误并尝试编译时,我可能会在生成的文件中收到诸如“方法必须有返回类型”之类的错误。但是当我双击错误时,它不会将我带到生成的代码。这使得很难看出它出了什么问题。
有什么窍门吗?当编译失败时,有什么方法可以检查生成的代码吗?更一般地说,生成的代码何时可用于 IntelliSense,何时不可用,由什么决定?
我使用的是 Visual Studio Professional 2022 版本 17.1.6 和 ReSharper 2022.1。
提前致谢!
使用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文件中.
有没有人尝试过这样的事情?它是如何为你工作的?您可以分享哪些见解,包括优缺点,成功秘诀等等?
谢谢!
我们需要动态生成委托类型.我们需要根据输入参数和输出生成委托.输入和输出都是简单类型.
例如,我们需要生成
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.
欢迎就这种方法的可行性提出建议.
我正在研究一些更新xsds生成的类的工作.我认为这将很好地利用T4模板,但我没有看到任何人这样做的例子.基本上,我想做Linq到XSD所做的事情,但没有在生产解决方案中包含alpha构建目标.
那里有相关的链接吗?
现在是维基.在此处存储您的相关答案.