Personalizzato obiettivo comune di creare una soluzione di

Ho creato un custom obiettivo comune “RealClean” che rimuovere tutti i file di output ” e “output directory”. L’ho messo in Microsoft.Comune.obiettivi di file.
Quando ho eseguito MsBuild sul mio csproj tutto è andato bene.
Ma quando ho eseguito MsBuild sul mio sln (che proprio in riferimento a un elenco di csproj) ho il seguente errore

error MSB4057: The target "RealClean" does not exist in the project.

Qui è la riga di comando devo inserire per eseguire MsBuild

C:\Windows\Microsoft .NET\Framework\v3.5\MsBuild.exe /p:Configuration="Release";OutputPath="..\..\MSBuild.Referentiel.net35";nowarn="1591,1573" /t:RealClean mySolution.sln

Qualche suggerimento?



3 Replies
  1. 5

    Di lavorare su file di soluzione, MSBuild crea un temporaneo MSBuild file di progetto contenente solo alcuni obiettivi, come Costruire e Pulito. Così non si possono chiamare personalizzato di destinazione su un file di soluzione.

    • Ok ho capito. Sono andato in questo file di progetto temporaneo e comprende Costruire, Pulito, Ricostruire e Pubblicare. Non importa dal comune.obiettivi.i file. Peccato, dovrò trovare un’altra soluzione.
    • Questo non si applica a qualsiasi Visual Studio genera, giusto?
  2. 16

    Ho avuto lo stesso problema, ma non si desidera modificare le cose al di fuori della struttura di origine al fine di ottenere questo lavoro. L’aggiunta di file C:\Program i File… significa che è necessario eseguire questa operazione manualmente su ogni dev macchina per avere lo stesso comportamento.

    Ho fatto tre cose:

    1) Creati un Custom obiettivi file che mi importa in ogni C# e/o VB/F# progetto nella mia soluzione, aggiungendo il seguente per ogni prog di file:

    <!-- Rest of project file -->
    
    <PropertyGroup Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">
        <!-- Relative path to containing solution folder -->
        <SolutionDir>..\</SolutionDir>
    </PropertyGroup>
    <Import Project="$(SolutionDir)CommonSettings.targets" />

    2) Aggiunto un target clean che viene chiamato dopo il reale Pulito (utilizzando il AfterTargets attributo MSBuild 4.0):

    <Target Name="CleanCs" AfterTargets="Clean">
        <Message Text="Deep cleaning C# project..." />
        <CreateItem Include="$(OutDir)**\*.*; $(ProjectDir)\obj\**\*.*; $(IntermediateOutputPath)**\*.*"
                                Exclude="**\bin\**\*.vshost.exe; $(IntermediateOutputPath)**\*.log">
            <Output TaskParameter="Include" ItemName="AfterClean_FilesToDelete"/>
        </CreateItem>
        <Delete Files="@(AfterClean_FilesToDelete)" />
        <CreateItem Include="$(ProjectDir)\obj\" >
            <Output TaskParameter="Include" ItemName="AfterClean_DirectoriesToDelete" />
        </CreateItem>
        <CreateItem Include ="$(ProjectDir)\bin\" Condition="'$(TargetExt)' != '.exe'" >
            <Output TaskParameter="Include" ItemName="AfterClean_DirectoriesToDelete"/>
        </CreateItem>
        <RemoveDir ContinueOnError="true" Directories="@(AfterClean_DirectoriesToDelete)" />
    </Target>

    3) Nella mia continua integrazione di progetto MSBuild posso controllare e assicurarsi che tutti i prog file #1:

    <ItemGroup>
        <!-- Exclude viewer acceptance tests as they must compile as x86 -->
        <CheckProjects_CsProjects Include="**\*.csproj" />
    </ItemGroup>
    <Target Name="CheckProjects">
        <!-- 
            Look for C# projects that don't import CommonSettingsCs.targets 
        -->
        <XmlRead XPath="//n:Project[count(n:Import[@Project[contains(string(), 'CommonSettingsCs.targets')]]) = 0]/n:PropertyGroup/n:AssemblyName/text() "
            XmlFileName="%(CheckProjects_CsProjects.Identity)"
            Namespace="http://schemas.microsoft.com/developer/msbuild/2003"
            Prefix="n" >
            <Output TaskParameter="Value" ItemName="CheckProjects_CsMissingImports"/>
        </XmlRead>
        <Error Text="Project missing CommonSettingsCs.targets: %(CheckProjects_CsMissingImports.Identity)"
                     Condition="'%(CheckProjects_CsMissingImports.Identity)' != ''" />
    </Target>

    Questo impedisce agli sviluppatori di dimenticare di aggiungere #1. È possibile creare il proprio modello di progetto per garantire che al di nuovi progetti per impostazione predefinita.

    Il vantaggio di questo approccio è la creazione di una nuova fonte albero di arruolamento non comporta nulla di più di raggiungere l’attuale struttura di origine. Lo svantaggio è che è necessario modificare il file di progetto una volta che si creano.

    • Grazie! Trascorso metà la mattina alla ricerca di una soluzione decente per questo; il vostro #3 punto era l’anello mancante.
    • Grazie. Se non altro, il AfterTargets proprietà mi ha messo il giusto percorso
    • E ‘ stato 7 anni dal momento che questa risposta è stato pubblicato. Mentre è bene, mi chiedo se ora c’è un meno prolisso modo per fare questo?
    • Ci potrebbe essere, ma io davvero non ci VS questi giorni. Per quanto ne so il progetto di sistema non è cambiato significativamente.
  3. 5

    Madgnome è probabilmente giusto. Ma volevo aggiungere che non dovrebbe essere la modifica della Microsoft.comune.obiettivi di file. Se si fa così si rischia di avere un diverso processo di costruzione su che macchina rispetto a quello che hanno fatto tutti gli altri. Nel tuo caso si potrebbe avere creato un nuovo file di MSBuild con il solo RealClean di destinazione e posto a
    C:\Program Files (x86)\MSBuild\v4.0\Custom.Dopo.Microsoft.Comune.obiettivi
    o per 32 bit
    C:\Program File\MSBuild\v4.0\Custom.Dopo.Microsoft.Comune.obiettivi
    e, in sostanza, che sarebbe come mettere il file all’interno di Microsoft.Comune.gli obiettivi, tranne che non hanno a modificare il file.

    • Grazie! Che saranno più puliti.
    • qualsiasi ancora un modo per fare questa modifica a livello di soluzione invece che a livello di macchina?

Lascia un commento