Ich arbeite an der Einrichtung eines Buildservers für unsere Mannschaft.Microsoft (TFS) Build - Server - Der Typ oder Namespace - Name '...' existiert nicht im Namespace '...' (fehlt eine Assembly - Referenz?)
Hintergrund
Wir verwenden Microsoft Visual Studio 2010 Ultimate. Unser Produkt enthält C# -Code (hauptsächlich), externe DLLs und C-Code. Wir arbeiten mit .Net 4.0 und haben mehr als 70 Projekte.
Wir mit 3 Zweigen unseres Code arbeiten:
- Produktion branche (was zur Zeit freigegeben wird)
- Test-branche (Hot Fixes, Fehlerbehebung Endbenutzers Tests)
- Entwicklung branche (neue Einträge hinzufügen)
Alle Zweige sind unter TF Source Control.
Tor
Was wir wollen, ist ein Build-Server haben alle Unit-Tests für alle Zweige einmal pro Tag zu erstellen und auszuführen, sollte der Build-Server den Code in der Quellcodeverwaltung verwenden. Unser Ziel ist eine schnelle Standardfehlererkennung. Wir würden so wenig wie keine Wartung des Build-Servers bevorzugen.
Wir werden nicht die Builds verwenden, die der Buildserver produziert, alles was wir wollen ist, den Buildserver zu verwenden, um unsere Zweige kontinuierlich zu erstellen und zu testen.
Was eingerichtet ist
Es gibt derzeit zwei die Build-Definition eingerichtet, eine für den Test-Branche und eine für die Entwicklung Branche, bauen beide Definitionen den Code aus dem Quellensteuer nehmen (das Teil funktioniert alles gut), aber hier beginnt der Spaß.
Problem
Die Test-Branche können alle fein Erstellen und Ausführen von Unit-Tests.
Die Entwicklung Branche kann aufgrund einem aufbauen (oder wie 5) Fehler:
The type or namespace name 'XXX' does not exist in the namespace 'YYY' (are you missing an assembly reference?)
Der Fehler ist für das Projekt X refereing Y. Beide Projekt X und Y für C# 4.0 Projekte zu projizieren, und Wir haben die volle Kontrolle über beide, sowohl X als auch Y werden zu DLLs kompiliert. Projekt Y enthält eine Schnittstelle, die die Klassen in Projekt X implementieren.
Das lästige Detail ist, gibt es keinen Unterschied in der Test Branche und Development Brance für entweder Projekt X oder Y. Die beiden Projekte waren in den letzten 3 Monaten völlig identisch.
Die Frage ist also, warum funktioniert es in der Testbranche, aber nicht in der Entwicklung branche?
Ich habe getestet:
- Die Projekte sind richtig miteinander refered. - Alle 3 Zweige haben kein Problem, auf eigenen/irgendwelchen meiner Mitarbeiterentwicklungsmaschinen zu bauen (wir haben auf 5 verschiedenen Maschinen getestet). - Ich habe versucht, das gesamte X-Projekt zu löschen und neu zu erstellen, hat nicht funktioniert. - Ich habe versucht, das ganze Y-Projekt zu löschen und neu zu erstellen, hat nicht funktioniert. - Ich habe versucht, den Namespace für Projekt X-Projekt und seine Klassen zu ändern, hat nicht funktioniert. - Ich habe versucht, den Namespace für Projekt Y-Projekt und seine Klassen zu ändern, hat nicht funktioniert. - (Ich habe sogar meine Entwicklungsmaschine neu gestartet) - Alle Änderungen wurden immer in die Quellcodeverwaltung eingecheckt, wo nach dem Buildserver gesetzt wurde zu bauen.
Zusatzinformationen
Ich habe um in den Logging-Dateien gegraben und fand einige interessante Details, dann ist dies für die Einzelheiten der Baumaßnahme X in der Entwicklung Branche
Task "AssignProjectConfiguration"
Project reference "..\..\A" has been assigned the "Debug|x86" configuration.
Project reference "..\..\Y" has been assigned the "Debug|x86" configuration. (can see there is a project Y)
Project reference "..\..\B" has been assigned the "Debug|x86" configuration.
Aber dann in der Task „ResolveAssemblyReference“
Task "ResolveAssemblyReference"
TargetFrameworkMoniker:
.NETFramework,Version=v4.0
TargetFrameworkMonikerDisplayName:
.NET Framework 4
TargetedRuntimeVersion:
v4.0.30319
Assemblies:
System
System.Xml.Linq
System.Data.DataSetExtensions
Microsoft.CSharp
System.Data
System.Xml
System.Core
AssemblyFiles:
C:\Builds\1\A
C:\Builds\1\B
(----- Missing project Y -----)
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll
Wo im Test Brance für die gleiche Aufgabe
Task "ResolveAssemblyReference"
TargetFrameworkMoniker:
.NETFramework,Version=v4.0
TargetFrameworkMonikerDisplayName:
.NET Framework 4
TargetedRuntimeVersion:
v4.0.30319
Assemblies:
System
System.Data.Entity
System.Xml.Linq
System.Data.DataSetExtensions
Microsoft.CSharp
System.Data
System.Xml
System.Core
AssemblyFiles:
C:\Builds\1\A
C:\Builds\1\B
C:\Builds\1\Y (There it is)
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll
So fühlt es sich wie es aus irgendeinem Grund nur „vergisst“ der Verweis von Projekt X zu Y. Projekt
Hilfe
Wenn Sie mit dem MSBuild-Protokollierungsdetail auf "Detailliert" oder "Diagnose" erstellen, sollte es während der ResolveAssemblyReference-Task viel mehr Informationen ausspucken, einschließlich jeder gesuchten Stelle, die keine Referenz gefunden hat. Hat das irgendwelche Warnungen/Fehler? –
Kurz vor der Task "ResolveAssemblyReference" wird folgende Warnung ausgegeben: "Task" Warnung " c: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets (1200,9): Warnung: Das referenzierte Projekt '.. \ Y' existiert nicht. [C: \ Builds \ 1 \ X] Fertig ausgeführt Task "Warnung" .' –
Ich sehe früher in der Protokolldatei gibt es: 'nicht aus Datei kopieren" C: \ Builds \ 1 \ ... \ ... \ y ", um" C: \ Builds \ 1 \ y "abzulegen, weil der Parameter" SkipUnchangedFiles "im Projekt auf" true "gesetzt wurde und die Größe und der Zeitstempel der Dateien übereinstimmen.So sieht es so aus da sein. Und noch mehr, die Y-DLL wird zum Ablageort gesendet, aber X-DLL ist nicht. Also ist die Y-DLL kompiliert. –