Проект в моем решении VS 2008 перестраивается каждый раз - PullRequest
3 голосов
/ 03 ноября 2010

У меня есть проект C # в VS 2008, который перестраивается каждый раз, когда я создаю решение, хотя ничего в этом проекте, как и в его зависимостях, не изменилось.Это вызывает огромную проблему, потому что решение довольно большое (> 100 проектов), и этот один проект находится на очень низком уровне в цепочке зависимостей, поэтому теперь он вызывает перестройку большинства других проектов, когда перестройка не должна иметьбыло необходимо.(Я делаю «Build Solution», а не «Rebuild Solution».)

Я знаю, что этот проект является виновником, поскольку я превратил «Многословность вывода сборки проекта MSBuild» в «Диагностика».Затем я собираю решение дважды, не меняя ничего между сборками.Во второй сборке это первый проект в решении, которое перестраивается, что определяется тем, что Csc.exe выполняется.

Вот что я вижу в выводе сборки:

------ Build started: Project: COS.BusinessEntities, Configuration: Debug Any CPU ------

...

Target "CoreCompile" in file "c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.CSharp.targets":
 Building target "CoreCompile" completely.
 Output file "bin\Debug\COS.BusinessEntities.XML" does not exist.
 Task "Csc"
  Command:
  c:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1591,1573,0219,0168,1572,1587,1570,1701,1702 /errorreport:prompt /warn:4 /doc:bin\Debug\COS.BusinessEntities.XML /define:DEBUG;TRACE ...

Таким образом, получается, что когда он попадает в проект COS.BusinessEntities, он не находит "bin \ Debug \ COS"..BusinessEntities.XML ".Но я убедился, что этот файл действительно существует после первой сборки, и я не верю, что он удаляется и воссоздается (но я открыт для предложений о том, как это проверить).Я пытался наблюдать за папкой во время второй сборки и никогда не видел, чтобы она исчезла.

Другая подсказка заключается в том, что это поведение началось при определенной регистрации, когда разработчик добавил в проект два файла: файл OptionsEntities.edmx и OptionsEntities.Designer.cs.Следующее также было добавлено в файл COS.BusinessEntities.prj:

  <Compile Include="Options\Entities\OptionsEntities.Designer.cs">
   <AutoGen>True</AutoGen>
   <DesignTime>True</DesignTime>
   <DependentUpon>OptionsEntities.edmx</DependentUpon>
  </Compile>

  ...

  <EntityDeploy Include="Options\Entities\OptionsEntities.edmx">
   <Generator>EntityModelCodeGenerator</Generator>
   <LastGenOutput>OptionsEntities.Designer.cs</LastGenOutput>
  </EntityDeploy>

Очевидно, что эти записи необходимы для файла edmx, но мне интересно, являются ли некоторые значения неправильными, вызывая такое поведение.Я точно знаю, что это виновник, как будто я получаю предыдущий набор изменений, эта проблема исчезнет;проект не перестраивается при сборке решения после изменения кода.

Любая помощь приветствуется!Я ломаю себе голову уже несколько дней!

Спасибо,

Крис

РЕДАКТИРОВАТЬ: После удаления XML-файла документации XML из проекта, я все еще получаю ту же проблему, но вот новый вывод:

Target "CoreCompile" in file "c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.CSharp.targets":
  Building target "CoreCompile" completely.
  Input file "C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D36.tmp" is newer than output file "obj\Debug\COS.BusinessEntities.pdb".
  Task "Csc"
    Command:
    c:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1591,1573,0219,0168,1572,1587,1570,1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE ...

... и этот временный файл каждый раз отличается!Хлоп!Что попробовать сейчас?

РЕДАКТИРОВАТЬ 2: Вот соответствующие части вывода сборки, связанные с этим временным файлом (они начинаются в рамках проекта BusinessEntities):

Target "SplitResourcesByCulture" in file "c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets":
  Task "Warning" skipped, due to false condition; ('@(ResxWithNoCulture)'!='') was evaluated as (''!='').
  Task "Warning" skipped, due to false condition; ('@(ResxWithCulture)'!='') was evaluated as (''!='').
  Task "Warning" skipped, due to false condition; ('@(NonResxWithCulture)'!='') was evaluated as (''!='').
  Task "Warning" skipped, due to false condition; ('@(NonResxWithNoCulture)'!='') was evaluated as (''!='').
  Task "AssignCulture"
    Culture of "" was assigned to file "C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D36.tmp".
    Culture of "" was assigned to file "C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D38.tmp".
    Culture of "" was assigned to file "C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D37.tmp".
  Done executing task "AssignCulture".
Done building target "SplitResourcesByCulture" in project "COS.BusinessEntities.csproj".
Target "CreateManifestResourceNames" in file "c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.CSharp.targets":
  Task "CreateCSharpManifestResourceName"
    Root namespace is 'COS.BusinessEntities'.
    Resource file 'C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D36.tmp' doesn't depend on any other file.
    Resource file 'C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D36.tmp' gets manifest resource name 'COS.BusinessEntities.tmp6D36.tmp'.
    Resource file 'C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D38.tmp' doesn't depend on any other file.
    Resource file 'C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D38.tmp' gets manifest resource name 'COS.BusinessEntities.tmp6D38.tmp'.
    Resource file 'C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D37.tmp' doesn't depend on any other file.
    Resource file 'C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D37.tmp' gets manifest resource name 'COS.BusinessEntities.tmp6D37.tmp'.
  Done executing task "CreateCSharpManifestResourceName".
  Task "CreateCSharpManifestResourceName" skipped, due to false condition; ('%(EmbeddedResource.ManifestResourceName)' == '' and '%(EmbeddedResource.WithCulture)' == 'true' and '%(EmbeddedResource.Type)' == 'Non-Resx') was evaluated as ('' == '' and 'false' == 'true' and 'Non-Resx' == 'Non-Resx').
Done building target "CreateManifestResourceNames" in project "COS.BusinessEntities.csproj".

И затемчуть дальше:

Target "_GenerateCompileInputs" in file "c:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets":
  Task "Warning" skipped, due to false condition; ('@(ManifestResourceWithNoCulture)'!='' and '%(ManifestResourceWithNoCulture.EmittedForCompatibilityOnly)'=='') was evaluated as (''!='' and ''=='').
  Task "Warning" skipped, due to false condition; ('@(ManifestNonResxWithNoCultureOnDisk)'!='' and '%(ManifestNonResxWithNoCultureOnDisk.EmittedForCompatibilityOnly)'=='') was evaluated as ('C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D36.tmp;C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D38.tmp;C:\Documents and Settings\<my username>\Local Settings\Temp\tmp6D37.tmp'!='' and 'true'=='').
Done building target "_GenerateCompileInputs" in project "COS.BusinessEntities.csproj".

Так что, похоже, есть и несколько других временных файлов, но я не уверен, почему они генерируются или почему они считаются входными данными для проекта.,

Большое спасибо за помощь!

1 Ответ

0 голосов
/ 28 декабря 2010

Ну, я наконец понял это. Выложить ответ для потомков.

В обозревателе решений дважды щелкнул файл EDMX, из-за которого открывался Обозреватель моделей. В обозревателе моделей я выбрал свою модель, а в окне «Свойства» изменил «Обработка артефактов метаданных» на «Копировать в выходной каталог».

После этого все работает нормально (без ненужных перестроек)!

Кроме того, мне сказали, что этого не происходит в VS2010 (хотя я не проверял это).

...