如何从包中添加新的构建操作
How to add new in Build Action from a package
我想在 Item > Properties > “Build Action”下添加一个新的 item/type 来自包(即 nuget)
我参考了Avalonia:
- Item Schema File
- Avalonia.props
- Avalonia.target
- AvaloniaBuildTasks.props
- AvaloniaBuildTasks.targets
- Avalonia.csproj
我删掉了很多不必要的东西,结果是这样的:
- Project.props
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<PropertyPageSchema Include="$(MSBuildThisFileDirectory)PermissionsText.xml" />
<AvailableItemName Include="PermissionsText" />
<CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="SourceItemGroup"/>
</ItemGroup>
<ItemGroup Condition="'$(EnableDefaultItems)'=='True'">
<PermissionsText Include="**\*.ptxt" />
</ItemGroup>
<Target Name="_InjectAdditionalFiles" BeforeTargets="GenerateMSBuildEditorConfigFileShouldRun">
<ItemGroup>
<AdditionalFiles Include="@(PermissionsText)" SourceItemGroup="PermissionsText" />
</ItemGroup>
</Target>
</Project>
- Project.targets
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Remove="**\*.ptxt" />
</ItemGroup>
</Project>
- Project.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<IncludeBuildOutput>false</IncludeBuildOutput>
<!-- Package Info -->
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.2" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<None Include="$(OutputPath)$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
<Content Include="PermissionsText.xml">
<Pack>true</Pack>
<PackagePath>build\;buildTransitive\</PackagePath>
</Content>
<Content Include="PermissionsNodeGenerator.props">
<Pack>true</Pack>
<PackagePath>build\;buildTransitive\</PackagePath>
</Content>
<Content Include="PermissionsNodeGenerator.targets">
<Pack>true</Pack>
<PackagePath>build\;buildTransitive\</PackagePath>
</Content>
</ItemGroup>
</Project>
- 其他项目文件可用here
我已经盯着这个和 Avalonia 的代码看了好几个小时,我非常确定它们是相似的,但是我似乎无法弄清楚为什么 Avalonia 的类型出现而我的没有。据我所知,最重要的部分是 AvailableItemName
和 PropertyPageSchema
,它们都存在于 props 文件中。我也非常确定 props 文件已加载完毕。我的项目依赖于其他文件(在同一个 props 文件中定义),如果它们没有定义
就会崩溃 InvalidOperationException: Sequence contains no elements
之后,我通过 mmaitre314 发现了这个 guide。它将 AvailableItemName
和 PropertyPageSchema
属性放在目标中而不是道具中,我已经尝试这样做希望它会起作用,但是它仍然没有出现在构建操作中
感谢任何帮助,提前致谢!
我认为它应该有效。做了一些测试,看来我们需要做点什么或者等一段时间让它显示(延迟?也许)。
很难说哪一步重要或让它起作用,但我确实做了这些事情:
1). 右键单击项目(测试项目)> 卸载项目 > 再次右键单击它 > 重新加载项目。
2).关闭项目(测试项目),然后重新打开。
3). 创建了一个 .ptxt
文件并将其包含到项目中。排除了再包含。
我不确定为什么、如何或什么但是:我删除了项目的本地副本,从提供的 GitHub link 中克隆了它,重建它并重新引用了它,现在可以使用了。
我有一些猜测为什么它可能没有用,尽管它们似乎都是错误的:
- 来源Generators/Analyzers 无法定义自己的内容types/build 操作。删除分析器部分没有帮助
- 我在 .NET Core 3.1 项目上测试它,但它是一个 .NET Standard 2.0 源代码生成器。重新定位任何一个项目以匹配都没有帮助
- 架构文件、道具、and/or 目标文件格式不正确。现在检查了大约 10 次以上,我很确定这不是问题所在
- 测试项目的
.vs
或 obj
文件夹正在缓存项目的旧版本,其中没有自定义类型。我已经删除了它们,尽管它没有帮助,此外,从 GitHub 上的精确副本重建工作,而不是我的本地副本
- 这个项目的名字太long/badly格式了(我快绝望了)。同样错误的是,创建了一个名为
ClassLibrary1LONGNAMESourceGenerator
的项目(肯定包括数字),复制文件,然后重建它。成功了,所以名字不是问题
- 其他几个疯狂的猜测
谢谢大家的帮助!
我想在 Item > Properties > “Build Action”下添加一个新的 item/type 来自包(即 nuget)
我参考了Avalonia:
- Item Schema File
- Avalonia.props
- Avalonia.target
- AvaloniaBuildTasks.props
- AvaloniaBuildTasks.targets
- Avalonia.csproj
我删掉了很多不必要的东西,结果是这样的:
- Project.props
<?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <PropertyPageSchema Include="$(MSBuildThisFileDirectory)PermissionsText.xml" /> <AvailableItemName Include="PermissionsText" /> <CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="SourceItemGroup"/> </ItemGroup> <ItemGroup Condition="'$(EnableDefaultItems)'=='True'"> <PermissionsText Include="**\*.ptxt" /> </ItemGroup> <Target Name="_InjectAdditionalFiles" BeforeTargets="GenerateMSBuildEditorConfigFileShouldRun"> <ItemGroup> <AdditionalFiles Include="@(PermissionsText)" SourceItemGroup="PermissionsText" /> </ItemGroup> </Target> </Project>
- Project.targets
<?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <None Remove="**\*.ptxt" /> </ItemGroup> </Project>
- Project.csproj
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> <IncludeBuildOutput>false</IncludeBuildOutput> <!-- Package Info --> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.2" PrivateAssets="all" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0" PrivateAssets="all" /> </ItemGroup> <ItemGroup> <None Include="$(OutputPath)$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" /> <Content Include="PermissionsText.xml"> <Pack>true</Pack> <PackagePath>build\;buildTransitive\</PackagePath> </Content> <Content Include="PermissionsNodeGenerator.props"> <Pack>true</Pack> <PackagePath>build\;buildTransitive\</PackagePath> </Content> <Content Include="PermissionsNodeGenerator.targets"> <Pack>true</Pack> <PackagePath>build\;buildTransitive\</PackagePath> </Content> </ItemGroup> </Project>
- 其他项目文件可用here
我已经盯着这个和 Avalonia 的代码看了好几个小时,我非常确定它们是相似的,但是我似乎无法弄清楚为什么 Avalonia 的类型出现而我的没有。据我所知,最重要的部分是 AvailableItemName
和 PropertyPageSchema
,它们都存在于 props 文件中。我也非常确定 props 文件已加载完毕。我的项目依赖于其他文件(在同一个 props 文件中定义),如果它们没有定义
InvalidOperationException: Sequence contains no elements
之后,我通过 mmaitre314 发现了这个 guide。它将 AvailableItemName
和 PropertyPageSchema
属性放在目标中而不是道具中,我已经尝试这样做希望它会起作用,但是它仍然没有出现在构建操作中
感谢任何帮助,提前致谢!
我认为它应该有效。做了一些测试,看来我们需要做点什么或者等一段时间让它显示(延迟?也许)。
很难说哪一步重要或让它起作用,但我确实做了这些事情:
1). 右键单击项目(测试项目)> 卸载项目 > 再次右键单击它 > 重新加载项目。
2).关闭项目(测试项目),然后重新打开。
3). 创建了一个 .ptxt
文件并将其包含到项目中。排除了再包含。
我不确定为什么、如何或什么但是:我删除了项目的本地副本,从提供的 GitHub link 中克隆了它,重建它并重新引用了它,现在可以使用了。
我有一些猜测为什么它可能没有用,尽管它们似乎都是错误的:
- 来源Generators/Analyzers 无法定义自己的内容types/build 操作。删除分析器部分没有帮助
- 我在 .NET Core 3.1 项目上测试它,但它是一个 .NET Standard 2.0 源代码生成器。重新定位任何一个项目以匹配都没有帮助
- 架构文件、道具、and/or 目标文件格式不正确。现在检查了大约 10 次以上,我很确定这不是问题所在
- 测试项目的
.vs
或obj
文件夹正在缓存项目的旧版本,其中没有自定义类型。我已经删除了它们,尽管它没有帮助,此外,从 GitHub 上的精确副本重建工作,而不是我的本地副本 - 这个项目的名字太long/badly格式了(我快绝望了)。同样错误的是,创建了一个名为
ClassLibrary1LONGNAMESourceGenerator
的项目(肯定包括数字),复制文件,然后重建它。成功了,所以名字不是问题 - 其他几个疯狂的猜测
谢谢大家的帮助!