„Copy Local“ referencí ve Visual Studiu

Copy Local standardně zobrazuje hodnotu True, ale ve skutečnosti to znamená neuvedeno, protože v *.csproj souboru není nic uvedeno. Pokud běží build na stroji, který má assembly uložené v GAC, nebude knihovna zkopírována do složky bin.

2014-10-24_1711

Řešení je jednoduché, stačí hodnotu nastavit na False a zpět na True. Tím dojde k uložení informace do *.csproj souboru a sice v elementu Reference přibyde nový element Private s hodnotou True.

<Reference Include="Havit">
  <HintPath>...</HintPath>
  <Private>True</Private>
</Reference>

MSBuild v rámci TFS Build Service nevytváří Web Deployment Packages

Problém

V projektu máme webovou aplikaci, která má Publish Profile, který má vytvořit Web Deployment balíček. Balíček se úspěšně vytváří jak při spuštění MSBuildu z Visual Studia, tak z příkazové řádky na vývojářském počítači, tak při spuštění z příkazové řádky na počítači s TFS Build Service. Jenže při spuštění z TFS Build Service se balíček nevytvoří.

Proč to nefunguje

Podoba publish profile, který byl vyroben pomocí UI ve Visual Studio 2013 je (plus mínus) takováto:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>Package</WebPublishMethod>
<DesktopBuildPackageLocation>TfsPublish\BalicekKteryChciVytvorit.zip</DesktopBuildPackageLocation>
<PackageAsSingleFile>true</PackageAsSingleFile>
...
</PropertyGroup>
</Project>

Důvodem, proč se balíček nevytváří je skutečnost, že Visual Studio do publish profilu vytvoří vlastnost DesktopBuildPackageLocation, jenže je očekávána hodnota vlastnosti PackageLocation.

A jak to, že v rámci VS a z příkazové řádky to funguje? Protože PackageLocation se v průběhu načítání C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.targets nastaví podle DestopBuildPackageLocation.

<PackageLocation Condition="'$(PackageLocation)'=='' and !(('$(OutDir)' != '$(OutputPath)') Or ('$(IsDesktopBuild)' == 'False')) ">$(DesktopBuildPackageLocation)</PackageLocation>

Jenže jen za podmínky, kdy IsDesktopBuild není false (druhou podmínku není ukázanou výše třeba řešit). Otázkou je, kde se nastavuje hodnota vlastnosti IsDesktopBuild. Odpověď se skrývá v témže souboru:

<IsDesktopBuild Condition="'$(IsDesktopBuild)'=='' And '$(TeamFoundationServerUrl)' != ''">False</IsDesktopBuild>

A problém je objasněn – TFS Build Service nastavuje hodnotu TeamFoundationServerUrl, čímž se build liší od spuštění z příkazové řádky.

Možnosti řešení

Nastavení vlastnosti PackageLocation bohužel nefunguje v rámci vlastního targetu, neboť to je již pozdě. Z vlastnosti se odvozují další vlastnosti během načítání target souborů.

  1. Natvrdo nastavit hodnotu IsDesktopBuild na True při spouštění MS Buildu. Nenašel jsem žádné jiné použití této vlastnosti, tedy alespoň prozatím jde o bezpečné řešení.
  2. Během studia zmíněného souboru s MSBuild targety jsem našel, že se MSBuild po importu PublishProfile souboru (pubxml) pokouší importovat ještě další targety, pokud existují. Šlo by tedy takový soubor vytvořit a v něm zkopírovat hodnotu z DesktopBuildPackageLocation do PackageLocation.
    Pokud se projekt jmenuje Web a ten obsahuje publish profile v Properties\PublishProfiles\TfsPublish.pubxml, pak se načítají
  • Web\Properties\PublishProfiles\TfsPublish.wpp.targets (viz vlastnost WebPublishProfileCustomizeTargetFile)
  • Web\*.wpp.targets (viz vlastnost WebPublishPipelineCustomizeTargetFile)
  • Web\..\wpp.deploysettings.targets (viz WebPublishPipelineSolutionTargetFile)

Advanced .NET Debugging – záznam, slides a dema [MS Fest Brno 2014]

Slides z mé přednášky 18.10.2014 pro konferenci MS Fest Brno:

Z přednášky jsem pořizoval záznam, který najdete na našem HAVIT YouTube Channelu:

Základní algoritmy v praxi [MS Fest Brno 2014]

Slides z mé přednášky 18.10.2014 pro konferenci MS Fest Brno:

Z přednášky jsem pořizoval záznam, který najdete na našem HAVIT YouTube Channelu:

Prohlížeč fotografií Windows zobrazuje obrázky s výrazným barevným posunem

Barvy obrázků mohou být posunuty do různých barev, obvykle do žluta, do červena, do růžova nebo něco mezi tím.

Problém nejspíš spočívá v chybné interpretaci barevných profilů. Pokud barevné profily k ničemu nepoužíváme, můžeme je odebrat a použít profil sRGB. Tím je problém vyřešen a prohlížeč fotografií zobrazuje obrázky čistě.

2014-10-17_1034