【问题标题】:MSBuild path related issueMSBuild 路径相关问题
【发布时间】:2020-08-23 00:11:25
【问题描述】:

我有一个库并同时为它创建一个 Nuget 有 MSBuild 和 .targets 文件定义要移动的内容。

构建\proj.targets 文件:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <ExResources Include="$(MSBuildThisFileDirectory)..\staticwebassets\ExFiles\*" />
    <Message Importance="high" Text="@(ExResources)" />    
    <DefaultValues Include="$(MSBuildThisFileDirectory)..\staticwebassets\*" />
  </ItemGroup>
  <Target Name="CopyResources" BeforeTargets="BeforeCompile" >
    <Message Importance="high" Text="Copying resources to consumer app!" />
    <Message Importance="high" Text="First up, all resources, except the default config" />
    <Message Importance="high" Text="@(ExResources)" />
    <Copy SourceFiles="@(ExResources)"
          DestinationFolder="$(MsBuildProjectDirectory)\wwwroot\component_library\" />
    <Message Importance="high" Text="Now what's left is the default config, which we only write if it doesn't exist yet" />
    <Message Importance="high" Text="@(DefaultValues)" />
    <Copy SourceFiles="@(DefaultValues)"
          DestinationFolder="$(MsBuildProjectDirectory)\wwwroot\"/>
  </Target>
</Project>

在 .csProj 文件中:

  <ItemGroup>
    <Folder Include="build\" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="build\*.targets" PackagePath="build\" />
  </ItemGroup>

有 2 个问题:

首先,运行 msbuild 时出现以下错误:

ExFiles 位于库的根目录中)

proj.targets(46,7): 
error MSB4184: 
The expression "[System.IO.Path]::GetDirectoryName('')" cannot be evaluated. 
The path is not of a legal form.

第二,这个错误不告诉你是哪个路径。 使用各种形式、命令和工具构建,例如:

dotnet msbuild "D:\SSS\Proj.csproj" -v:diag -bl

还尝试了 MSBuild 结构化日志查看器,它没有显示任何其他信息。

.targets 文件中的任何消息都不会显示在 VS 输出窗口中。 所以,我从未见过"Copying resources to consumer app!""@(ExResources)" 的值

【问题讨论】:

    标签: visual-studio msbuild nuget


    【解决方案1】:

    错误 MSB4184:表达式 无法评估“[System.IO.Path]::GetDirectoryName('')”。这 path 不是合法的形式。

    我认为您没有在proj.targets 文件和该文件中提供全部信息,并且您当然使用[System.IO.Path]::GetDirectoryName 函数将值传递给proj.targets 文件中的属性。

    如果是这样,你应该使用这种类型:

    &lt;new property&gt;$([System.IO.Path]::GetDirectoryName($(Property1)))&lt;/new Property&gt;

    注意

    从错误信息来看,可能是当前属性中没有定义 Property1。所以你应该确保它是在new Property之前定义的。

    另外,您最好在新的 PropertyGroup 下创建这个新属性,这样可以避免一些麻烦。

    所以在proj.targets试试这些:

    <PropertyGroup>
    <Property1>xxx</Property1>
    </PropertyGroup>
    
    <PropertyGroup>
    <new property>$([System.IO.Path]::GetDirectoryName($(Property1)))</new Property>
    </PropertyGroup>
    

    .targets 文件中的任何消息都不会显示在 VS 输出中 窗户。所以,我从未见过“将资源复制到消费者应用程序!”或者 “@(ExResources)”的值

    您是否打包了这个库,然后将其安装在另一个项目上,如果是,您应该检查新项目上的构建输出,而不是 dotnet msbuild "D:\SSS\Proj.csproj" -v:diag(库项目),proj.targets 将在安装库包后的新项目。见this link

    注意:nuget机制中的build/&lt;package_id&gt;.targets会自动导入到引用nuget包的新项目中,并在新项目中使用,而不是当前库项目中使用。

    另外,如果你想查看库项目中的props.targets文件,你应该手动将文件配置到库项目中,并确保你在当前有这个&lt;Import Project="xxxxx\build\props.targets" /&gt; Proj.csproj,然后你的库项目就可以使用了。

    而且您可以使用dotnet msbuild "D:\SSS\Proj.csproj" -v:diag 来查看。

    希望它可以帮助您,如果我误解了您的问题,请随时告诉我们并提供任何详细信息供我们研究。

    【讨论】:

    • 谢谢Perry Qian,我把它标记为答案+1,我使用了一个库,那是额外的配置,我以为提供的大多数MSBuild脚本都是独立的,并没有注意到GetDirectoryName可能是该库的一部分,请给我 1-2 小时的时间来阅读/应用/研究您提供的内容,如果需要,将回复您以获得额外的反馈、问题和更多详细信息。
    • 试图使用github.com/excubo-ag/Blazor.LazyStyleSheet库,我将该项目的.target文件粘贴到hastebin.com/axutokiveg.xml
    • 它对你有什么好处吗?您知道我找到问题并以更方便的方式调试/处理下一个问题的最佳下一步行动是什么?
    • 如果你的项目没有明确使用该包,你只需卸载它
    • 我的项目使用它,与它的作者交谈,他告诉那些SCSS文件可以独立于组件。如何记录、调试导致该错误的路径?
    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 2010-09-24
    • 1970-01-01
    • 2014-05-09
    • 2016-01-08
    • 2011-04-29
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多