【问题标题】:Nuget does not import .targetsNuget 不导入 .targets
【发布时间】:2019-03-04 12:18:45
【问题描述】:

我想通过 nuget 将我的 .targets 文件添加到项目中。 我有下一个 .nuspec 文件:

<package >
  <metadata>
  ...
  </metadata>
  <files>
    <file src="..\..\Rcs\Rcs\bin\Release\Rcs.targets" target="build\Rcs.targets" />
    <file src="..\..\Rcs\Rcs\bin\Release\Rcs.dll" target="lib\Xamarin.iOS10\Rcs.dll" />     


    <file src="..\..\Rcs\Rcs\bin\Release\*.dll" />
    <file src="..\..\Rcs\Rcs\bin\Release\*.config" />

  </files>
</package>

还有.targets文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
        <RcsDirectory Condition="$(RcsDirectory) == '' Or $(RcsDirectory) == '*Undefined*'">$(MSBuildThisFileDirectory)..\..\</RcsDirectory>
  </PropertyGroup>

  <UsingTask
    TaskName="Rcs.RcsBuildTask"
    AssemblyFile="$(RcsDirectory)Rcs.dll" />

  <Target AfterTargets="Build" Name="RcsBuildTask">
    <RcsBuildTask
      ProjectPath="$(MSBuildProjectFullPath)"
      RootNamespace="$(RootNamespace)"
    />
  </Target>
</Project>

安装此 nuget 后,新项目不会添加到项目中。 任何帮助将不胜感激

【问题讨论】:

    标签: nuget-package


    【解决方案1】:

    您确定 .targets 文件确实没有导入到您的 Nuget 包中吗?

    除了.nuspec 文件,您还应该使用Nuget CLI 来打包文件。 不要使用 dotnet CLI

    使用nuget pack 命令创建.nupkg 文件后,您可以使用Nuget Package Explorer 或简单地WinRar 打开您的包(我相信这也适用于7-zip)。

    此时,如果您看到您的.targets 文件或您的Rcs.dll 丢失,则表示您的.nuspec 文件有问题。 确保您的 .nuspec 文件的名称为 ProjectName.nuspec

    .csproj 中指定.nuspec 文件

    <PropertyGroup>
      [...]
      <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
      <NuspecFile>ProjectName.nuspec</NuspecFile>
      [...]
    </PropertyGroup>
    

    如果您的.targets 文件在您的.nupkg 中,那么这意味着它的执行根本不符合您的预期。

    安装 Nuget 包时,文件将存储到 Nuget cache。在 Windows 上,它位于 %userprofile%\.nuget\packages。你的.targets 文件和你的Rcs.dll 也应该在那里

    首先,您可以将其包含在您的 .targets 文件中

    <Target Name="TestMessage" AfterTargets="Build" >
        <Message Text="***********************************************************" Importance="high"/>
        <Message Text="$(MSBuildThisFileDirectory)" Importance="high"/>
        <Message Text="***********************************************************" Importance="high"/>
    </Target>
    

    在构建项目时,您会看到当前文件夹实际上是您的缓存(而不是您的项目目录)

    如果我理解,您想要的是将您的 Rcs.dll 复制到您的 bin 文件夹中。为此,您可以在 .targets 文件中编写类似的任务

    <ItemGroup>
        <Content Include="$(MSBuildThisFileDirectory)\..\lib\Xamarin.iOS10\Rcs.dll">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
    </ItemGroup>
    

    .targets 文件未复制到引用 Nuget 包的项目中是正常行为。 .targets 文件应保留在 Nuget 缓存中,但从那里执行 MsBuild 命令以复制 Rcs.dll 文件。

    希望你能理解我的回答并解决你的问题。

    【讨论】:

    • 如果 .targets 在 nuget 包中怎么办,它被“解包”到 NuGet 缓存中,我将“调试”当前目录打印机放在 .targets 中,发现它没有被称为 no当我使用引用的 nuget 包构建项目时,调试输出位于 VS 的“构建”输出中。我的下一个“调查点”在哪里?谢谢。
    • @MaximV.Pavlov 我相信如果您设置Importance="high",您的消息应该会显示任何详细配置。但以防万一您的 Visual Studio 设置尝试将详细程度更改为normal,如this answer 中所述。同样使用文本编辑器,确保 Nuget 缓存中的 .targets 文件具有正确的格式。我在another answer 中写了一个例子。将ItemGroup 节点放置在Project 节点之间的正确位置。
    【解决方案2】:

    我发现通过使用 NuGet 包资源管理器,必须正确命名目标文件。默认情况下,NPE 使用 .targetets。看来其他名称可能不起作用。

    我的 ID 是“Handy.TargetFrameworkVersionCumulativePreprocessorSymbols”,但我已将目标文件命名为“HandyTargetFrameworkVersionCumulativePreprocessorSymbols.targets”。

    一旦我在任何地方都使用了“Handy.TargetFrameworkVersionCumulativePreprocessorSymbols”,它就按预期工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2018-02-08
      • 2021-05-11
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多