13

作成したカスタムMSBuildタスクを使用して、BeforeBuildステップをcsprojに追加するnugetパッケージを作成したいと思います。理想的には、次のことを行います。

  1. csprojファイル(MyCustomBeforeBuildTarget)に新しいターゲットを追加します
  2. BeforeBuildターゲットがまだ存在しない場合は、追加します
  3. BeforeBuild DependsOnTargets属性を編集して、カスタムターゲットを含めます

したがって、インストール後、csprojは次のようになります。

<Target Name="MyCustomBeforeBuildTarget" Condition="SomeCondition">
     <MyCustomTask />
</Target>
<Target Name="BeforeBuild" DependsOnTargets="MyCustomBeforeBuildTarget">

</Target>

また、カスタムタスクDLLが存在しない場合にターゲットを無視するようにする条件を追加しましたが、パッケージを削除するとカスタムターゲットも表示されなくなると便利です。

カスタムターゲットを追加する、作成できる最も単純なPowershell nugetインストールスクリプトは何ですか?ここにあるPowerShellスクリプトがソリューションの一部を形成しているのではないかと感じていますが、実際にそれらを使用してcsprojを編集する方法を知るのに十分なPowerShellの経験がありません。

4

2 に答える 2

13

NuGetPowerToolsは、パッケージを追加するプロジェクトのプロジェクトセットアップでの作業を容易にするいくつかのPowerShell関数を追加するパッケージです使用可能な関数を使用するには、次のようにパッケージnuspecファイルの依存関係タグを使用してパッケージをNuGetPowerToolsに依存させる必要があります。

<dependencies>
  <dependency id="NuGetPowerTools" version="0.26" />
</dependencies>

これにより、プロジェクトのビルドプロジェクト表現への参照を取得できるようになります。

install.ps1次に、NuGetパッケージのフォルダーにファイルを配置する必要がありtoolsます。このPowerShellファイルは、パッケージのインストール時に実行され、インストール後に再度実行されることはありません。

ファイルは次のようになります。

#First some common params, delivered by the nuget package installer
param($installPath, $toolsPath, $package, $project)

# Grab a reference to the buildproject using a function from NuGetPowerTools
$buildProject = Get-MSBuildProject

# Add a target to your build project
$target = $buildProject.Xml.AddTarget("PublishWebsite")

# Make this target run before build
# You don't need to call your target from the beforebuild target,
# just state it using the BeforeTargets attribute
$target.BeforeTargets = "BeforeBuild"

# Add your task to the newly created target
$target.AddTask("MyCustomTask")

# Save the buildproject
$buildProject.Save()

# Save the project from the params
$project.Save()

それはそれであるはずです。

よろしく

ジェスパーハウジ

于 2011-09-08T07:19:51.053 に答える
9

次のコードは、CodeAssassin.WixWebProjectReferencesというパッケージからのものです。インストールおよびアンインストール時に、プロジェクトファイルに次のインポートタグを追加および削除します。パッケージには依存関係は必要ありません。

<Import Project="..\packages\CodeAssassin.WixWebProjectReferences.1.0\tools\CodeAssassin.WixWebProjectReferences.targets" />

パッケージをダウンロードし、NuGetPackageExplorerを使用して開いて、その実行方法を確認します。

以下は、install.ps1とuninstall.ps1のコードです(これらは、NuGetパッケージのコンテンツフォルダーが空でない場合にのみ実行されます)。

(PowerShellの強調表示が見つからなかったため、代わりにphpを使用しましたが、完全ではありません。)

install.ps1

param (
    $InstallPath,
    $ToolsPath,
    $Package,
    $Project
)

$TargetsFile = 'CodeAssassin.WixWebProjectReferences.targets'
$TargetsPath = $ToolsPath | Join-Path -ChildPath $TargetsFile

Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

$MSBProject = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($Project.FullName) |
    Select-Object -First 1

$ProjectUri = New-Object -TypeName Uri -ArgumentList "file://$($Project.FullName)"
$TargetUri = New-Object -TypeName Uri -ArgumentList "file://$TargetsPath"

$RelativePath = $ProjectUri.MakeRelativeUri($TargetUri) -replace '/','\'

$ExistingImports = $MSBProject.Xml.Imports |
    Where-Object { $_.Project -like "*\$TargetsFile" }
if ($ExistingImports) {
    $ExistingImports | 
        ForEach-Object {
            $MSBProject.Xml.RemoveChild($_) | Out-Null
        }
}
$MSBProject.Xml.AddImport($RelativePath) | Out-Null
$Project.Save()

アンインストール.ps1

param (
    $InstallPath,
    $ToolsPath,
    $Package,
    $Project
)

$TargetsFile = 'CodeAssassin.WixWebProjectReferences.targets'

Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

$MSBProject = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($Project.FullName) |
    Select-Object -First 1

$ExistingImports = $MSBProject.Xml.Imports |
    Where-Object { $_.Project -like "*\$TargetsFile" }
if ($ExistingImports) {
    $ExistingImports | 
        ForEach-Object {
            $MSBProject.Xml.RemoveChild($_) | Out-Null
        }
    $Project.Save()
}

サンプルターゲット-一部のファイルを出力パスにコピーするファイル

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
    <ItemGroup>
        <Files Include="..\packages\Insert_Path_To_Your_Package_Folder_Here\bin\*" />
    </ItemGroup>
    <Target Name="Insert_Name_of_Your_Target_Here" AfterTargets="AfterBuild">
        <Copy SourceFiles="@(Files)" DestinationFolder="$(TargetDir)\bin\" SkipUnchangedFiles="true" />
    </Target>
</Project>
于 2012-08-27T21:57:07.673 に答える