项目构建错误 - 与NETStandard.Library2.0.1有关(我认为!



我在尝试构建项目时遇到这个奇怪的错误:

Error: The reference to the built-in metadata "FileName" at position 1 is not allowed in this condition "'%(FileName)' != 'netstandard'".  C:githubVSAPIVS.API.PublicVS.API.Public.csproj
at Microsoft.Build.Shared.ProjectErrorUtilities.ThrowInvalidProject(String errorSubCategoryResourceName, IElementLocation elementLocation, String resourceName, Object[] args)
at Microsoft.Build.Evaluation.Parser.Parse(String expression, ParserOptions optionSettings, ElementLocation elementLocation)
at Microsoft.Build.Evaluation.ConditionEvaluator.EvaluateConditionCollectingConditionedProperties[P,I](String condition, ParserOptions options, Expander`2 expander, ExpanderOptions expanderOptions, Dictionary`2 conditionedPropertiesTable, String evaluationDirectory, ElementLocation elementLocation, ILoggingService loggingServices, BuildEventContext buildEventContext, ProjectRootElementCache projectRootElementCache)
at Microsoft.Build.Execution.ProjectInstance.EvaluateCondition(String condition)
at JetBrains.Platform.MsBuild.TaskCommon.ProjectModel.Bindings.AddWildcardItemsFromXml(ProjectRootElement element, Boolean isImported, ProjectInstance projectInstance, List`1 items)
at JetBrains.Platform.MsBuild.TaskCommon.ProjectModel.Bindings.BindWildcardItems(Project project, ProjectInstance projectInstance)
at JetBrains.Platform.MsBuild.TaskCommon.ProjectModel.Bindings.Bind(Project project, ProjectInstance projectInstance, List`1 targetErrors, List`1 targetWarnings, Dictionary`2 resultsByTarget)
at JetBrains.Platform.MsBuild.TaskCommon.ProjectModel.Bindings.Bind(Project project, ProjectInstance projectInstance)
at JetBrains.Platform.MsBuild.TaskCommon.Build.BuildSessionHost.HandleSubmissionFinished(RdBuildRequest request, ProjectWithEvents projectWithEvents, Boolean succeeded, RdTask`1 rdTask)

我不知道这个错误意味着什么,甚至不知道从哪里开始。这是一个 Web API 项目,当我对项目执行重新生成时,它会显示在 Visual Studio 的"生成结果"窗口中。

该错误提到了这种情况的问题:'%(FileName)' != 'netstandard'在 .csproj 文件中。但是在 .csproj 文件中进行搜索时不会出现这种情况。

如果我在解决方案文件夹中的所有文件中进行搜索,我可以在C:githubvspackagesNETStandard.Library.2.0.1build中找到它:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<NETStandardLibraryPackageVersion>2.0.1</NETStandardLibraryPackageVersion>
</PropertyGroup>
<ItemGroup Condition="'$(_NetStandardLibraryRefPath)' != ''">
<Reference Include="$(_NetStandardLibraryRefPath)*.dll">
<!-- Private = false to make these reference only -->
<Private>false</Private>
<!-- hide these from Assemblies view in Solution Explorer, they will be shown under packages -->
<Visible>false</Visible>
<Facade Condition="'%(FileName)' != 'netstandard'">true</Facade>
<NuGetPackageId>NETStandard.Library</NuGetPackageId>
<NuGetPackageVersion>$(NETStandardLibraryPackageVersion)</NuGetPackageVersion>
</Reference>
<ReferenceCopyLocalPaths Condition="'$(_NetStandardLibraryLibPath)' != ''" Include="$(_NetStandardLibraryLibPath)*.dll">
<Private>false</Private>
<Facade Condition="'%(FileName)' != 'netstandard'">true</Facade>
<NuGetPackageId>NETStandard.Library</NuGetPackageId>
<NuGetPackageVersion>$(NETStandardLibraryPackageVersion)</NuGetPackageVersion>
</ReferenceCopyLocalPaths>
</ItemGroup>
</Project>

但是我对 .targets 文件的工作原理还不够了解,不知道如何解决这个问题......通常它只是工作。

如果我尝试谷歌此错误,我也找不到任何相关结果。有人知道这里出了什么问题吗?

我正在使用Visual Studio Professional 15.6.0。该项目面向 .net462。

但我对 .targets 文件的工作原理了解不够,不知道如何解决这个问题

根据 NuGet 文档创建本机包:

包还可以在 \build 中包含目标和 props 文件 NuGet 将自动导入到使用 包。

这意味着 NuGet 会将相应的.props.targets文件导入到项目中。因此,当您将包NETStandard.Library.2.0.1安装到项目中时,NETStandard.Library.targets文件(在该包的build 文件夹中)将被导入到项目文件中,卸载项目,对其进行编辑,然后您将找到以下代码:

<Import Project="..packagesNETStandard.Library.2.0.1buildNETStandard.Library.targets" Condition="Exists('..packagesNETStandard.Library.2.0.1buildNETStandard.Library.targets')" />

现在,.targets文件将用作项目文件。

正如您所想,此问题的原因应该与包NETStandard.Library.2.0.1有关。

根据 MSBuild 文档 MSBuild Batching:

属性函数可能不会出现在元数据值中。例如

%(Compile.FullPath.Substring(0,3))

是不允许的。

所以你会得到那个错误

此处不允许在位置 1 中使用内置元数据"文件名" 条件 "'%(文件名)' != '网络标准'">

若要解决此问题,可以在自定义目标中指定项组:

<Target Name="YourCustomName">    
<ItemGroup Condition="'$(_NetStandardLibraryRefPath)' != ''">
<Reference Include="$(_NetStandardLibraryRefPath)*.dll">
...
</Reference>
<ReferenceCopyLocalPaths Condition="'$(_NetStandardLibraryLibPath)' != ''" Include="$(_NetStandardLibraryLibPath)*.dll">
...
</ItemGroup>       
<Message Text="@(Reference)"/>
</Target>

来源:如何筛选项组?

或者,您可以创建一个属性来存储此自定义元数据的值:

<PropertyGroup>
<FimeName>%(FileName)</FimeName>
</Pro‌​pertyGroup>
<ItemGroup>
...
<Facade Condition="'$(FileName)' != 'netstandard'">true</Facade>
...
</ItemGroup>

来源:在条件中使用元数据

此外,如果您可以确保不使用该.targets文件,则可以尝试删除项目文件中的<Import Project="..packagesNETStandard.Library.2.0.1buildNETStandard.Library.targets" ... />

相关内容

  • 没有找到相关文章

最新更新