Skip to content

Add SDK package for generating global CLI tool shims #660

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
May 1, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion BuildTools.sln
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Microsoft Visual Studio Solution File, Format Version 12.00
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27121.1
MinimumVisualStudioVersion = 15.0.26730.03
Expand Down Expand Up @@ -92,6 +92,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Internal.AspNetCore.SiteExt
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Tests", "test\NuGetPackageVerifier.Tests\NuGetPackageVerifier.Tests.csproj", "{439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.DotNet.GlobalTools.Sdk", "src\Microsoft.DotNet.GlobalTools.Sdk\Microsoft.DotNet.GlobalTools.Sdk.csproj", "{449E2FD8-AE30-4C4E-8FC2-E797B99CF339}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -166,6 +168,10 @@ Global
{439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Release|Any CPU.Build.0 = Release|Any CPU
{449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Debug|Any CPU.Build.0 = Debug|Any CPU
{449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Release|Any CPU.ActiveCfg = Release|Any CPU
{449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -189,6 +195,7 @@ Global
{605F0478-A9D2-4A8A-BB38-9D5DC132FBB5} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0}
{418F99A5-5EC4-4895-B8EB-7F8BBA241DB2} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76}
{439CC7A3-F6E6-46B8-B6A0-05E22E558FC2} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0}
{449E2FD8-AE30-4C4E-8FC2-E797B99CF339} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {1B8809C8-A6C3-4761-BC91-B12841F49AE1}
Expand Down
2 changes: 1 addition & 1 deletion build/dependencies.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<HtmlAgilityPackPackageVersion>1.5.1</HtmlAgilityPackPackageVersion>
<MicrosoftDotNetPlatformAbstractionsVersion>2.0.0</MicrosoftDotNetPlatformAbstractionsVersion>
<MicrosoftNETCoreApp20PackageVersion>2.0.0</MicrosoftNETCoreApp20PackageVersion>
<MicrosoftNETCoreApp21PackageVersion>2.1.0-preview2-26325-03</MicrosoftNETCoreApp21PackageVersion>
<MicrosoftNETCoreApp21PackageVersion>2.1.0-rc1-26425-06</MicrosoftNETCoreApp21PackageVersion>
<MicrosoftNETTestSdkPackageVersion>15.6.1</MicrosoftNETTestSdkPackageVersion>
<MicrosoftWin32RegistryPackageVersion>4.4.0</MicrosoftWin32RegistryPackageVersion>
<MonoCecilPackageVersion>0.10.0-beta6</MonoCecilPackageVersion>
Expand Down
2 changes: 1 addition & 1 deletion build/repo.targets
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@

<ItemGroup>
<_ModuleProjects Include="$(RepositoryRoot)modules\%(KoreBuildModule.Identity)\%(Identity).*proj">
<AdditionalProperties>PublishDir=$(_KoreBuildIntermediateDir)modules\%(Identity)\</AdditionalProperties>
<AdditionalProperties>Version=$(Version);PublishDir=$(_KoreBuildIntermediateDir)modules\%(Identity)\</AdditionalProperties>
</_ModuleProjects>
</ItemGroup>

Expand Down
3 changes: 3 additions & 0 deletions files/KoreBuild/KoreBuild.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ set_korebuildsettings() {
[ -z "${dot_net_home:-}" ] && dot_net_home="$HOME/.dotnet"
[ -z "${tools_source:-}" ] && tools_source="$default_tools_source"


if [ "$ci" = true ]; then
dot_net_home="$repo_path/.dotnet"

Expand All @@ -29,6 +30,8 @@ set_korebuildsettings() {
export MSBUILDDEBUGPATH="$repo_path/artifacts/logs"
fi

export DOTNET_ROOT="$DOTNET_HOME"

return 0
}

Expand Down
7 changes: 6 additions & 1 deletion files/KoreBuild/scripts/KoreBuild.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -314,13 +314,17 @@ function Set-KoreBuildSettings(
$DotNetHome = Join-Path $RepoPath ".dotnet"

$env:CI = 'true'
$env:DOTNET_HOME = $DotNetHome
$env:DOTNET_CLI_TELEMETRY_OPTOUT = 'true'
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = 'true'
$env:NUGET_SHOW_STACK = 'true'
$env:NUGET_PACKAGES = Join-Paths $RepoPath ('.nuget', 'packages')
$env:MSBUILDDEBUGPATH = Join-Paths $RepoPath ('artifacts', 'logs')
}

$arch = __get_dotnet_arch
$env:DOTNET_ROOT = if ($IS_WINDOWS) { Join-Path $DotNetHome $arch } else { $DotNetHome }

$global:KoreBuildSettings = @{
ToolsSource = $ToolsSource
DotNetHome = $DotNetHome
Expand Down Expand Up @@ -356,8 +360,9 @@ function Invoke-KoreBuildCommand(
}

$sdkVersion = __get_dotnet_sdk_version
$korebuildVersion = Get-KoreBuildVersion
if ($sdkVersion -ne 'latest') {
"{ `"sdk`": { `"version`": `"$sdkVersion`" } }" | Out-File (Join-Path $global:KoreBuildSettings.RepoPath 'global.json') -Encoding ascii
"{ `"sdk`": { `n`"version`": `"$sdkVersion`" },`n`"msbuild-sdks`": {`n`"Microsoft.DotNet.GlobalTools.Sdk`": `"$korebuildVersion`"}`n }" | Out-File (Join-Path $global:KoreBuildSettings.RepoPath 'global.json') -Encoding ascii
}
else {
Write-Verbose "Skipping global.json generation because the `$sdkVersion = $sdkVersion"
Expand Down
11 changes: 9 additions & 2 deletions files/KoreBuild/scripts/invoke-repository-build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,16 @@ repo_path="$(cd "$repo_path" && pwd)"
__verbose "Building $repo_path"

sdk_version="$(__get_dotnet_sdk_version)"
korebuild_version="$(__get_korebuild_version)"
if [ "$sdk_version" != 'latest' ]; then
echo "{ \"sdk\": { \"version\": \"${sdk_version}\" } }" > "$repo_path/global.json"
echo "{
\"sdk\": {
\"version\": \"${sdk_version}\"
},
\"msbuild-sdks\": {
\"Microsoft.DotNet.GlobalTools.Sdk\": \"${korebuild_version}\"
}
}" > "$repo_path/global.json"
else
__verbose "Skipping global.json generation because the \$sdk_version = $sdk_version"
fi
Expand All @@ -81,7 +89,6 @@ if [ ! -f "$msbuild_artifacts_dir" ]; then
mkdir -p "$msbuild_artifacts_dir"
fi

korebuild_version="$(__get_korebuild_version)"
cat > "$msbuild_response_file" <<ENDMSBUILDARGS
/nologo
/m
Expand Down
26 changes: 25 additions & 1 deletion modules/BundledPackages/BundledPackages.proj
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<ItemGroup>
<Projects Include="$(MSBuildThisFileDirectory)..\..\src\Internal.AspNetCore.Sdk\Internal.AspNetCore.Sdk.csproj" />
<Projects Include="$(MSBuildThisFileDirectory)..\..\src\ApiCheck.Console\ApiCheck.Console.csproj" />
<Projects Include="$(MSBuildThisFileDirectory)..\..\src\Microsoft.DotNet.GlobalTools.Sdk\Microsoft.DotNet.GlobalTools.Sdk.csproj" />
</ItemGroup>

<MSBuild Projects="@(Projects)"
Expand All @@ -13,7 +14,30 @@
BuildInParallel="true"
RemoveProperties="PublishDir" />

<Copy SourceFiles="module.props" DestinationFolder="$(PublishDir)" />
<PropertyGroup>
<!--
This is a workaround for https://github.com/Microsoft/msbuild/issues/2914.
Currently, the only way to configure the NuGetSdkResolver is with NuGet.config, which is not generally used in aspnet org projects.
This project is restored so that it pre-populates the NuGet cache with SDK packages.
-->
<BundledPackageRestorerContent>
<![CDATA[
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this need RestoreSources or does it pick the one via Directory.Build.props?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's set in the PreinstallBundledPackages target (see below). We can't set it here since the path will be machine-specific.

</PropertyGroup>
<ItemGroup>
<PackageReference Include="Internal.AspNetCore.Sdk" Version="$(Version)" />
<PackageReference Include="Microsoft.DotNet.GlobalTools.Sdk" Version="$(Version)" />
</ItemGroup>
</Project>
]]>
</BundledPackageRestorerContent>
</PropertyGroup>

<WriteLinesToFile File="$(PublishDir)BundledPackageRestorer.csproj" Lines="$(BundledPackageRestorerContent)" Overwrite="true" />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sad 👏

<Copy SourceFiles="module.props;module.targets" DestinationFolder="$(PublishDir)" />
</Target>

</Project>
15 changes: 15 additions & 0 deletions modules/BundledPackages/module.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<Project>
<PropertyGroup Condition="'$(DisableDefaultTargets)' != 'true'">
<PrepareDependsOn>PreinstallBundledPackages;$(PrepareDependsOn)</PrepareDependsOn>
</PropertyGroup>

<!--
This is a workaround for https://github.com/Microsoft/msbuild/issues/2914.
This pre-populates the NuGet cache with bundled packages.
-->
<Target Name="PreinstallBundledPackages">
<MSBuild Targets="Restore"
Projects="$(MSBuildThisFileDirectory)BundledPackageRestorer.csproj"
Properties="RestoreSources=$(KoreBuildBundledPackageFolder)" />
</Target>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<Project>

<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />

<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<NuspecFile>$(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec</NuspecFile>
<Serviceable>false</Serviceable>
<NoPackageAnalysis>true</NoPackageAnalysis>
<IncludeBuildOutput>false</IncludeBuildOutput>
<IncludeSource>false</IncludeSource>
<IncludeSymbols>false</IncludeSymbols>
</PropertyGroup>

<Target Name="SetPackageProperties" BeforeTargets="GenerateNuspec">
<PropertyGroup>
<NuspecProperties>$(NuspecProperties);id=$(PackageId)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);version=$(PackageVersion)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);copyright=$(Copyright)</NuspecProperties>
</PropertyGroup>
</Target>

<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />

<Target Name="Compile" />
<Target Name="CopyFilesToOutputDirectory" />
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>$id$</id>
<version>$version$</version>
<authors>Microsoft</authors>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Provides additional support to .NET Core teams producing global CLI tools. This package is only intended for internal Microsoft use.</description>
<copyright>$copyright$</copyright>
<packageTypes>
<!-- This project needs to be MSBuildSdk because its targets need to influence the way /t:Restore works -->
<packageType name="MSBuildSdk" />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does Razor Sdk need one of these?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Depends. Do you expect users to reference razor as a PackageReference or only as an Sdk?

If you add this, UI tooling in VS for PackageReference will break.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preferably both. We use it as a PackageReference in other repos in aspnet

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If NuGet UI tooling wasn't a concern, I would say you should add this to your .nuspec

  <packageTypes>
      <packageType name="Dependency" /> <!-- PackageReference usage -->
      <packageType name="MSBuildSdk" /> <!-- Sdk usage -->
  </packageTypes>

But that might be dangerous because the NuGet team is thinking of breaking packages with multiple types.

See NuGet/Home#6298 and NuGet/Home#6484 for context.

</packageTypes>
</metadata>
<files>
<file src="_._" target="lib/netstandard1.0/_._" />
<file src="sdk\**\*" target="sdk/" />
</files>
</package>
43 changes: 43 additions & 0 deletions src/Microsoft.DotNet.GlobalTools.Sdk/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
Microsoft.DotNet.GlobalTools.Sdk
================================

Provides additional support to .NET Core teams producing global CLI tools. This package is only intended for internal Microsoft use.

## Usage
Projects that need to bundle and sign the global CLI tool shim should add this to their .csproj file. This will include files in the .nupkg.

```xml
<!-- In MyTool.csproj -->
<Project>
<Sdk Name="Microsoft.NET.Sdk" />
<Sdk Name="Microsoft.DotNet.GlobalTools.Sdk" />

<PropertyGroup>
<PackAsTool>true</PackAsTool>
<GenerateToolShims>true</GenerateToolShims>
</PropertyGroup>
</Project>
```

```js
// in global.json
{
"msbuild-sdks": {
"Microsoft.DotNet.GlobalTools.Sdk": "2.1.0-rtm-12345"
}
}
```

### Additional options

#### `GenerateToolShims` (property)

A boolean flag. When `true`, tool shims will be generated for each RID listed in `GeneratedShimRuntimeIdentifiers` and included in the .nupkg.

Default value = `false`

#### `GeneratedShimRuntimeIdentifiers` (property)

A semi-colon separate list of RIDs for which to generate and pack the shim.

Default value = `win-x86;win-x64;osx-x64`
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
</PropertyGroup>

<ItemGroup Condition="'$(DisableImplicitFrameworkReferences)' != 'true'">
<PackageReference Include="Microsoft.NETCore.DotNetAppHost" Version="$(MicrosoftNETCoreDotNetAppHostImplicitPackageVersion)" PrivateAssets="All" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
<TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);GetDotNetToolShimPackageContent</TargetsForTfmSpecificContentInPackage>
</PropertyGroup>

<PropertyGroup>
<!--
Define the package version of Microsoft.NETCore.DotNetAppHost to match the shared runtime version
-->
<MicrosoftNETCoreDotNetAppHostImplicitPackageVersion Condition="'$(MicrosoftNETCoreDotNetAppHostImplicitPackageVersion)' == ''">$(RuntimeFrameworkVersion)</MicrosoftNETCoreDotNetAppHostImplicitPackageVersion>

<!--
Only generate shims for these platforms.
-->
<GeneratedShimRuntimeIdentifiers Condition="'$(GeneratedShimRuntimeIdentifiers)' == ''">win-x86;win-x64;osx-x64</GeneratedShimRuntimeIdentifiers>

<!--
Define runtime identifiers to NuGet will restore the apphost for that RID.
-->
<RuntimeIdentifiers>$(RuntimeIdentifiers);$(GeneratedShimRuntimeIdentifiers)</RuntimeIdentifiers>
</PropertyGroup>

<!--
************************************************************
Target: GetDotNetToolShimPackageContent

Gets package content items for the global shim, without building anything.
************************************************************
-->
<Target Name="GetDotNetToolShimPackageContent" DependsOnTargets="_ComputeGeneratedDotNetToolShims">
<ItemGroup>
<!-- Add the file to the package -->
<TfmSpecificPackageFile Include="@(GeneratedDotNetToolShim)" />
</ItemGroup>
</Target>

<!--
************************************************************
Target: GenerateDotNetToolShims

Generates the dotnettool shims
************************************************************
-->
<Target Name="GenerateDotNetToolShims"
DependsOnTargets="_ComputeGeneratedDotNetToolShims;_CoreGenerateDotNetToolShim"
BeforeTargets="CoreCompile" />

<Target Name="_ComputeGeneratedDotNetToolShims">
<PropertyGroup>
<_NormalizedPackageVersion>$(PackageVersion)</_NormalizedPackageVersion>
<_NormalizedPackageVersion Condition="$(_NormalizedPackageVersion.Contains('+'))">$(_NormalizedPackageVersion.Substring($(_NormalizedPackageVersion.IndexOf('+'))))</_NormalizedPackageVersion>
</PropertyGroup>

<ItemGroup>
<_ShimRids Include="$(GeneratedShimRuntimeIdentifiers)" AppHostFileName="$(AssemblyName)" />
<_ShimRids Update="%(_ShimRids.Identity)" AppHostFileName="$(AssemblyName).exe" Condition="$([System.String]::new('%(_ShimRids.Identity)').StartsWith('win'))" />

<GeneratedDotNetToolShim Condition="'%(_ShimRids.Identity)' != ''" Include="$(IntermediateOutputPath)shims/%(_ShimRids.Identity)/%(_ShimRids.AppHostFileName)">
<RuntimeIdentifier>%(_ShimRids.Identity)</RuntimeIdentifier>
<OutputDir>$(IntermediateOutputPath)shims/%(_ShimRids.Identity)/</OutputDir>
<PackagePath>tools/$(TargetFramework)/any/shims/%(_ShimRids.Identity)/</PackagePath>
<RelativeAppBinaryFilePath>.store/$(PackageId.ToLowerInvariant())/$(_NormalizedPackageVersion)/$(PackageId.ToLowerInvariant())/$(_NormalizedPackageVersion)/tools/$(TargetFramework)/any/$(TargetFileName)</RelativeAppBinaryFilePath>
</GeneratedDotNetToolShim>
</ItemGroup>
</Target>

<!-- This task is defined in Microsoft.NET.Sdk -->
<UsingTask TaskName="EmbedAppNameInHost" AssemblyFile="$(MicrosoftNETBuildTasksAssembly)" />

<Target Name="_CoreGenerateDotNetToolShim"
DependsOnTargets="_ComputeGeneratedDotNetToolShims"
Inputs="$(MSBuildAllProjects);$(ProjectAssetsFile)"
Outputs="@(GeneratedDotNetToolShim)">

<MSBuild
Targets="_CoreGenerateDotNetToolShimForRid"
Projects="$(MSBuildProjectFullPath)"
Properties="
TargetFramework=$(TargetFramework);
RuntimeIdentifier=%(GeneratedDotNetToolShim.RuntimeIdentifier);
_ShimRelativeAppBinaryFilePath=%(GeneratedDotNetToolShim.RelativeAppBinaryFilePath);
_ShimOutputDir=%(GeneratedDotNetToolShim.OutputDir)"
Condition="'%(GeneratedDotNetToolShim.Identity)' != ''" />
</Target>

<Target Name="_CoreGenerateDotNetToolShimForRid" DependsOnTargets="ResolvePackageAssets">
<ItemGroup>
<NativeRestoredAppHostNETCore Include="@(NativeCopyLocalItems)"
Condition="'%(NativeCopyLocalItems.FileName)%(NativeCopyLocalItems.Extension)' == '$(_DotNetAppHostExecutableName)'"/>
</ItemGroup>

<NETSdkError Condition="'@(NativeRestoredAppHostNETCore->Count())' &gt; 1"
ResourceName="MultipleFilesResolved"
FormatArguments="$(_DotNetAppHostExecutableName)" />

<EmbedAppNameInHost AppHostSourcePath="@(NativeRestoredAppHostNETCore)"
AppHostDestinationDirectoryPath="$(_ShimOutputDir)"
AppBinaryName="$(_ShimRelativeAppBinaryFilePath)"/>
</Target>

</Project>
10 changes: 10 additions & 0 deletions src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
</PropertyGroup>

<Import
Project="Microsoft.DotNetTool.ShimGeneration.props"
Condition="'$(PackAsTool)' == 'true' AND '$(GenerateToolShims)' == 'true' AND '$(TargetFramework)' != ''" />
</Project>
Loading