24

特定のプラットフォーム用のライブラリを構築する必要がある CefSharp に依存するライブラリを作成しました。したがって、AnyCPU のサポートはありません。

これを NuGet にパックしたいと思います。私が理解している限りでは、これらのファイルをビルド フォルダーに配置し、.targets参照する正しい dll を選択するファイルを用意する必要があります。したがって、最終的には次のような NuGet パッケージになりました。

lib
    monodroid
        MyLib.dll
    xamarin.ios10
        MyLib.dll
    net45
        MyLib.dll (x86)
build
    net45
        x86
            MyLib.dll (x86)
        x64
            MyLib.dll (x64)
        MyLib.targets

.targetsファイル内に次のように記述します。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="PlatformCheck" BeforeTargets="InjectReference"
    Condition="(('$(Platform)' != 'x86') AND  ('$(Platform)' != 'x64'))">
    <Error  Text="$(MSBuildThisFileName) does not work correctly on '$(Platform)' platform. You need to specify platform (x86 or x64)." />
  </Target>
  
  <Target Name="InjectReference" BeforeTargets="ResolveAssemblyReferences">
    <ItemGroup Condition="'$(Platform)' == 'x86' or '$(Platform)' == 'x64'">
      <Reference Include="MyLib">
        <HintPath>$(MSBuildThisFileDirectory)$(Platform)\MyLib.dll</HintPath>
      </Reference>
    </ItemGroup>
  </Target>
</Project>

ここまでは順調ですね。今問題に。この NuGet を新しい WPF プロジェクトに追加すると、ライブラリへの参照が次の.csprojようにファイルに表示されます。

<Reference Include="MyLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d64412599724c860, processorArchitecture=x86">
  <HintPath>..\packages\MyLib.0.0.1\lib\net45\MyLib.dll</HintPath>
  <Private>True</Private>
</Reference>

.targetsファイルについては何も言及されていませんが。これはまだ NuGet 3 で行う方法ですか? 私は何か間違ったことをしましたか?現在、x86 ライブラリへの参照が原因で、x64 を実行している場合、これは実行時に失敗します。

4

3 に答える 3

22

これをあまりにも長い間いじった後、私はそれを理解しました。

どうやら、build.prop および build.target ファイルは、NuGet パッケージとまったく同じ名前にする必要があります。そうしないと、csproj ファイルに追加されません。

編集:

独自のプロジェクトでこれを使用する方法を示す小さな GitHub リポジトリを作成しました。

iOS 用、Android 用、および x86 と x64 の両方をターゲットとする Net45 の 3 つのプロジェクトによるソリューションを示します。

.props ファイルでは、パスがアンパックされた NuGet のフォルダー構造を指していることに注意してください。したがって、これらのパスは、nuspec ファイルに入力したものにマップされます。

リポジトリと同様に、nuspec を次のように定義します。

<?xml version="1.0"?>
<package>
  <metadata>
    <id>My.Awesome.Library</id>
    <version>1.0.0</version>
    <title>My Awesome Library</title>
    <description>Herpa Derpa</description>
  </metadata>
  <files>
    <file src="My.Awesome.Library.Droid\bin\Release\My.Awesome.Library.*"
      target="lib\monodroid70" />

    <file src="My.Awesome.Library.iOS\bin\Release\My.Awesome.Library.*"
      target="lib\xamarin.ios10" />

    <file src="My.Awesome.Library.Net45\bin\x64\Release\My.Awesome.Library.*"
      target="build\x64" />

    <file src="My.Awesome.Library.Net45\bin\x86\Release\My.Awesome.Library.*"
      target="build\x86" />
    <file src="My.Awesome.Library.Net45\bin\x86\Release\My.Awesome.Library.*"
      target="lib\net45" />
    
    <file src="My.Awesome.Library.props" target="build\net45" />
  </files>
</package>

x86 ファイルを にbuild\x86、x64 ファイルを に入れましbuild\x64た。この場合、これらのファイルのフォルダー ビルドの名前は基本的に何でもかまいません。ここで重要なのは、以下の props ファイルが、それぞれのプラットフォームのこれらのフォルダーを指していることです。

x86 libをlib\net45均等に配置するかどうかはわかりません。それを試すことができます。とにかく、小道具ファイルは正しいものを選択する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Reference Include="My.Awesome.Library" Condition="'$(Platform)' == 'x86'">
      <HintPath>$(MSBuildThisFileDirectory)..\x86\My.Awesome.Library.dll</HintPath>
    </Reference>
    <Reference Include="My.Awesome.Library" Condition="'$(Platform)' == 'x64'">
      <HintPath>$(MSBuildThisFileDirectory)..\x64\My.Awesome.Library.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

この場合、フォルダに$(MSBuildThisFileDirectory)なりbuild\net45\ます。パスが dll を正しく指していることを確認してください。ここbuild\net45で重要なのがフォルダです。これは、NuGet がターゲット ファイルと小道具ファイルを自動的にインポートする方法です。

My.Awesome.Libraryまた、名前がかなり一貫していることにも注意してください。ここで重要なのは、props ファイルの名前が NuGet パッケージ ID と一致することです。そうしないと、NuGet がインポートしないようです。

于 2016-02-09T21:53:59.023 に答える
-2

ソリューション全体を明確にするために、これが私にとって完璧に機能する方法です

.nu​​spec ファイル

 <?xml version="1.0"?>
<package>
  <metadata>
    <id>YourProjectName</id>
    <version>1.0.0</version>
    <authors>John Doe</authors>
    <title>Your Project Name</title>
    <description>Herpa Derpa</description>
  </metadata>
</package>

フォルダ構造

-- project.nuspec
-- build 
---- YourProjectName.props
---- YourProjectName.targets
-- tools
--- <x64>
---- YourProjectName.dll
--- <x86>
---- YourProjectName.dll

.props ファイル

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Reference Include="YourProjectName" Condition="'$(Platform)' == 'x86'">
          <HintPath>$(MSBuildThisFileDirectory)..\tools\x86\YourProjectName.dll</HintPath>
        </Reference>
        <Reference Include="YourProjectName" Condition="'$(Platform)' == 'x64'">
          <HintPath>$(MSBuildThisFileDirectory)..\tools\\x64\YourProjectName.dll</HintPath>
        </Reference>
      </ItemGroup>
    </Project>

.targets ファイル

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="PlatformCheck" BeforeTargets="BuildOnlySettings"
    Condition="(('$(Platform)' != 'x86') AND  ('$(Platform)' != 'x64'))">
    <Error  Text="$(MSBuildThisFileName) does not work correctly on '$(Platform)' platform. You need to specify platform (x86 or x64)." />
  </Target>

</Project>

これは 100% 有効なソリューションです。

于 2019-01-12T13:50:13.053 に答える