Msbuild из командной строки не копирует файлы, которые не нуждаются в компиляции, в выходной каталог - PullRequest
0 голосов
/ 17 октября 2010

В моем проекте (XNA .contentproj) у меня есть файлы, которые нужно скомпилировать, и файлы, которые просто нужно скопировать в выходной каталог:

    <Compile Include="Foo.cs" />
    <None Include="Bar.xml">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>

Это прекрасно работает, когда я компилирую изVisual Studio, но когда я собираю проект из командной строки , эти файлы «None» не копируются в выходной каталог.Я также попытался установить для копии значение «Всегда».

Как я могу сказать, что msbuild должна это делать?

РЕДАКТИРОВАТЬ.Может быть, мне не хватает некоторых параметров msbuild.

EDIT2: Теперь я обошел эту проблему, просто вручную скопировав весь не-сборочный контент в выходной каталог.Это прекрасно работает, но все равно кажется «неправильным».

Ответы [ 2 ]

1 голос
/ 19 сентября 2014

Скорее всего, это связано с определением конкретных целей для проектов XNA (в целом или вашего конкретного).«Ни один» элемент не является каким-либо особенным, он обрабатывается так же, как и любой другой элемент, в том смысле, что, если нет конкретной задачи, которая на самом деле его обрабатывает, они не будут иметь никакого эффекта.Файлы общих целей - например, Microsoft.CSharp.targets;Microsoft.Cpp.targets - обрабатывать элементы «None» должным образом, как описано здесь .

Одна возможность состоит в том, что уже определена цель, которая копирует элементы None в вашфайл проекта, но эта цель не включена в атрибут DefaultTargets узла 'Project' вашего файла проекта.Если это так, вы все равно можете вызвать эту цель, передав ее в аргументе командной строки / target .

Другой (и менее вероятный) вариант заключается в том, что VS правильно обрабатываетэти элементы, даже если в вашем проекте нет определенной цели.Есть несколько способов обойти это:

  1. Прямой путь - определить цель, которая копирует файлы и добавить ее к целям по умолчанию, или, альтернативно, поместить ее в цепочку целей с помощью BeforeTargets / AfterTargets,Например (см. Документацию по задаче «Копировать» здесь ):
  <Target Name="CopyNoneItems">
    <Copy SourceFiles="@(None)"
    DestinationFolder="$(OutputPath)" />
  </Target>

Хакерский способ - включить целевой файл, который правильно обрабатывает элементы none в файле вашего проекта (например, Microsoft.CSharp.targets) - это хакерский, потому что вы импортируете кучу других вещей, которые выне нужно в процессе, что может привести к другим проблемам

Долгий путь - парсинг целевых файлов для CSharp (или любого другого типа проекта, который правильно обрабатывает элементы None)), чтобы увидеть, какой внутренний импортированный файл целей обрабатывает элементы «Нет», и, возможно, импортировать только этот файл.Я выбрал # 1, когда у меня возникла проблема, поэтому я не уверен, существует ли такой чистый файл .targets, который действительно будет работать, так как, вероятно, существуют некоторые зависимости между всеми этими файлами назначения

Если вам нужно выбрать один из них, я бы порекомендовал перейти к # 1.Это легко и просто, и имеет наименьшее количество побочных эффектов.

1 голос
/ 17 октября 2010

Просто сделайте это, например,

<None Include="Bar.xml">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>

(если вы измените свойства внутри VS, это должно быть сделано).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...