Проблема, связанная с путем MSBuild - PullRequest
0 голосов
/ 07 мая 2020

У меня есть библиотека и создание Nuget для нее, в то же время есть файл MSBuild и .targets, определяющий, что перемещать.

Файл Build \ 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 находится в root библиотеки)

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)"

1 Ответ

1 голос
/ 08 мая 2020

ошибка MSB4184: выражение «[System.IO.Path] :: GetDirectoryName ('')» не может быть вычислено. Путь не имеет юридической формы.

Я думаю, вы не предоставили всю информацию в файле proj.targets и в этом файле, и вы, безусловно, используете функцию [System.IO.Path]::GetDirectoryName для передачи значения в свойство в файле proj.targets.

Если да, вам следует использовать этот тип:

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

Примечание :

Судя по сообщению об ошибке, свойство 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 будет играть роль в новом проекте после установки пакета библиотеки. См. эту ссылку .

Примечание : build/<package_id>.targets в механизме nuget автоматически импортируется в новый проект, который ссылается на пакет nuget и используется в новом проект вместо текущего проекта библиотеки.

Вдобавок , если вы хотите увидеть файл props.targets в проекте библиотеки, вы должны вручную настроить файл в проект библиотеки и убедиться, что что у вас есть в этом <Import Project="xxxxx\build\props.targets" /> в текущем Proj.csproj, и тогда ваш проект библиотеки может его использовать.

И вы можете использовать dotnet msbuild "D:\SSS\Proj.csproj" -v:diag, чтобы увидеть это.

Надеюсь, это поможет вам, и если я неправильно понимаю вашу проблему, пожалуйста, дайте нам знать и предоставить любая подробная информация для нас, чтобы ее исследовать.

...