我是JetBrains产品的用户,更确切地说是IDE Rider。
我的同事主要是微软产品的用户,更具体地说是Visual Studio。
所以,我很惊讶,当他在Visual Studio中打开我的解决方案或c#项目时,它们被破坏了。(特定项目的属性)
这个错误有点误导,因为提到的常量实际上是定义的。它也是误导,因为错误的原因是在.csproj
-文件中添加了NuGet包信息。
对我来说,错误与原因有些无关,因此对我应该如何进行感到非常困惑。
下面是该错误的完整输出:
System.ArgumentException: Expected 1 values for property Build::DefineConstants, but got 0.
Parameter name: values
at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.Property.Update(ImmutableArray`1 values)
at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.Property..ctor(PropertyMetadata metadata, ImmutableArray`1 values, PropertyContext context, ImmutableHashSet`1 varyByDimensions)
at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.PropertyContextFactoryBase.ToProperty(IUIProperty property, Page page, Category category, Int32 order, PropertyContext propertyContext, IPropertyEditorRegistry propertyEditorRegistry)
at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.ProjectPropertyDataAccess.Observer.<HandleDataAsync>g__CreateProperties|14_5(<>c__DisplayClass14_0& )
at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.ProjectPropertyDataAccess.Observer.<HandleDataAsync>g__ProcessInitialData|14_1(<>c__DisplayClass14_0& )
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.ProjectPropertyDataAccess.Observer.<InitializeAsync>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.ProjectPropertyDataAccess.Observer.<CreateAsync>d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.ProjectPropertiesEditor.<>c__DisplayClass0_0.<<-ctor>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.PropertyPages.Designer.AsyncLoadContent.<>c__DisplayClass0_0.<<Initialize>b__0>d.MoveNext()
但我可以在Rider中打开这些项目属性而没有问题:
我已经将问题缩小到了特定的信息属性,我使用这些属性将信息放入NuGet包中。This documentation/guide提到我应该使用汇编信息,但我在使用nuget pack
时遇到了汇编信息获取的问题,这就是为什么我使用.csproj
文件中已知的属性。
然后我求助于遵循"Create a NuGet package using MSBuild"-Documentation中的信息,这是更好的选择,因为我可以将打包集成到构建中。
通过添加NuGet-Target-Package,我看到Rider中出现了一个新的选项卡,允许我编辑这些信息。这让我觉得我在Rider中做了正确的事情,但在Visual Studio中看到的结果,让我看起来像是在做一些我不知道的NuGet规范方面非常无意的事情。
下面是csproj文件的完整版本
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{63B8CCEF-5C50-4F25-8E6B-C623DA1BDD2F}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Testcenter.RobotFramework</RootNamespace>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<AssemblyName>Testcenter.RobotFramework</AssemblyName>
<FileAlignment>512</FileAlignment>
<DefineConstants>DEBUG</DefineConstants>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<!-- Properties which cause problems in Visual Studio. The error doesn't occur if these are commented out.
<TargetFramework>netframework4.8</TargetFramework>
<PackageId>Testcenter.RobotFramework</PackageId>
<Version>1.0.0</Version>
<Authors>Testcenter Team, Some Person</Authors>
<Company>SomeCompany</Company>
<PackageOutputPath>$(ProjectDir)</PackageOutputPath>
<Description>A class library to implement a remote library interface conforming to RobotFramework.</Description>
<Title>RobotFramework Remote-Library-Interface for C#</Title>
<Copyright>Copyright (c) SomeCompany 2022</Copyright>
<RepositoryUrl>https://redacted.url.com</RepositoryUrl>
<Product>Testcenter.RobotFramework</Product>
<AssemblyVersion>1.0.0</AssemblyVersion>
<FileVersion>1.0.0</FileVersion> -->
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Testing|AnyCPU' ">
<OutputPath>bin\Testing\</OutputPath>
<DefineConstants>TEST</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Libraries|AnyCPU' ">
<OutputPath>bin\Libraries\</OutputPath>
<DefineConstants>ONLY_LIBRARY</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="mscorlib" />
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Compile Include="Configuration\LibraryConfig.cs" />
<Compile Include="Configuration\ServerConfiguration.cs" />
<Compile Include="Configuration\XML\AssemblyElement.cs" />
<Compile Include="Configuration\XML\AssemblyElementCollection.cs" />
<Compile Include="Configuration\XML\PortElement.cs" />
<Compile Include="Configuration\XML\XmlServerConfiguration.cs" />
<Compile Include="Keyword\IKeywordManager.cs" />
<Compile Include="Keyword\Keyword.cs" />
<Compile Include="Keyword\KeywordErrorType.cs" />
<Compile Include="Keyword\KeywordManager.cs" />
<Compile Include="Keyword\KeywordResult.cs" />
<Compile Include="Keyword\KeywordStatus.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Trash\XmlDocumentation.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="README.md" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="5.1.0" />
<PackageReference Include="NuGet.Build.Tasks.Pack" Version="6.4.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Testcenter.RobotFramework.Exceptions" Version="1.0.0" />
<PackageReference Include="Testcenter.TestAutomation.Utility" Version="1.0.0" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
我的意图是将NuGet包信息嵌入到相应的项目文件中,而不必创建.nuspec
。
但是在遇到那个错误之后,感觉那可能是个误会。
我非常不确定现在什么是正确的,就以下方面而言:
- 如果我想遵守某些“规范”,我应该把这些NuGet-Assembly信息放在哪里?(我找不到必要的信息)
- 从.Net framework包创建NuGet包时,我是否需要一个NuGet-Spec文件?(NuGet-Spec是什么?我为什么需要它?)
- .Net NuGet package和.Net framework package之间有何区别?
我发现所有这些都非常令人困惑,因为在打包C#项目或创建NuGets方面我是新手。
但是我不得不在.NET Framework 4.8上工作,与.NET核心相比,这似乎使这个过程不是很简单。
1条答案
按热度按时间wwtsj6pe1#
DefineConstants
错误确实有点误导。我能够从您在我的机器上的初始.csproj
开始重现它,并将其缩小到TargetFramework
属性。移除
允许打开项目属性时不出错。将其更改为
重新引入错误。
进一步挖掘,这似乎是一个问题,是否Visual Studio示例有. NET框架4.8 SDK与. NET框架4.8目标包安装(参考Visual Studio Can't Target .NET Framework 4.8)。
你的问题中的NuGet部分实际上与你得到的错误完全无关,但是我会回答你的观点。
我的意图是将NuGet包信息嵌入到相应的项目文件中,而不必创建
.nuspec
。这很好,而且NuGet打包/发布场景(. NET和. NET Framework)都支持这一点。事实上,这是值得鼓励的。你需要阅读文档来了解哪些对NuGet很重要。
但是在遇到那个错误之后,感觉那可能是个误会。
是的
我应该将这些NuGet-Assembly信息放在哪里...
通常在
.csproj
中和/或使用汇编属性表示版本等内容。当我从. net framework包创建NuGet包时,我需要一个NuGet-Spec文件吗?(NuGet-Spec是什么?为什么我需要它?)
是的,它是一个manifest文件,嵌入到NuGet包中。如果你把属性放在
csproj
文件中,它就会自动生成,你不必手动创建它。NetNuGet包和. Netframework包之间的区别是什么?
从NuGet包管理器的Angular 来看,其实什么都不是,各种包管理器都需要清单,需要包内容(汇编和任何其他内容),需要按照作者的意图安装包。
从打包/发布的Angular 来看,步骤基本相同,但工具不同。
"终于..."
作为一个实验,如果你可以访问一个启用了ReSharper的VS示例,你可以尝试基于ReSharper的构建。我非常肯定它也不使用MSBuild,所以看看你的错误是否会发生可能会很有趣。